home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / falcon / programm.ing / asm56.zoo / gram.c < prev    next >
C/C++ Source or Header  |  1992-11-14  |  70KB  |  2,351 lines

  1.  
  2. # line 2 "a56.y"
  3. /*******************************************************
  4.  *
  5.  *  a56 - a DSP56001 assembler
  6.  *
  7.  *  Written by Quinn C. Jensen
  8.  *  July 1990
  9.  *  jensenq@npd.novell.com (or jensenq@qcj.icon.com)
  10.  *
  11.  *******************************************************\
  12.  
  13. /*
  14.  * Copyright (C) 1990-1992 Quinn C. Jensen
  15.  *
  16.  * Permission to use, copy, modify, distribute, and sell this software
  17.  * and its documentation for any purpose is hereby granted without fee,
  18.  * provided that the above copyright notice appear in all copies and
  19.  * that both that copyright notice and this permission notice appear
  20.  * in supporting documentation.  The author makes no representations
  21.  * about the suitability of this software for any purpose.  It is
  22.  * provided "as is" without express or implied warranty.
  23.  *
  24.  */
  25.  
  26. /*
  27.  *  a56.y - The YACC grammar for the assembler.
  28.  *
  29.  *  Note:  This module requires a "BIG" version of YACC.  I had to
  30.  *  recompile YACC in the largest mode available.
  31.  *
  32.  *  Other notes:
  33.  *
  34.  *  MOVEC, MOVEM and MOVEP must be used explicitly--MOVE can't yet figure
  35.  *  out which form to use.
  36.  *
  37.  */
  38.  
  39. #include "a56.h"
  40. unsigned int w0, w1, pc;
  41. extern BOOL list_on;
  42. BOOL uses_w1;
  43. int just_rep = 0;
  44. extern char inline[];
  45. char *spaces(), *luntab();
  46. char segs[] = "PXYL";
  47. int seg;
  48. int substatement = 0;
  49. BOOL long_symbolic_expr = FALSE;
  50.  
  51. struct n binary_op();
  52. struct n unary_op();
  53. struct n sym_ref();
  54.  
  55. #define R_R6            0x0001
  56. #define R_R5            0x0002
  57. #define R_R4            0x0004
  58. #define R_DATA_ALU_ACCUM    0x0008
  59. #define R_CTL_REG        0x0010
  60. #define R_FUNKY_CTL_REG        0x0020
  61. #define R_SDX            0x0040
  62. #define R_SDY            0x0080
  63. #define R_LSD            0x0100
  64. #define R_AB            0x0200
  65. #define R_XREG            0x0400
  66. #define R_YREG            0x0800
  67. /* registers to which short immediate move is an unsigned int */
  68. #define R_UINT            0x1000
  69. /* registers to which short immediate move is an signed frac */
  70. #define R_SFRAC            0x2000
  71.  
  72. # line 72 "a56.y"
  73. typedef union  {
  74.     int ival;    /* integer value */
  75.     struct n n;    /* just like in struct sym */
  76.     double dval;    /* floating point value */
  77.     char *sval;    /* string */
  78.     int cval;    /* character */
  79.     char cond;    /* condition */
  80.     struct regs {
  81.         int r6, r5, r4, data_alu_accum, ctl_reg, funky_ctl_reg;
  82.         int sdx, sdy, lsd, ab, xreg, yreg;
  83.         int flags;
  84.     } regs;
  85.     struct ea {
  86.         int mode;
  87.         int ext;
  88.         int pp;
  89.     } ea;
  90. } YYSTYPE;
  91. # define CHEX 257
  92. # define CDEC 258
  93. # define FRAC 259
  94. # define AREG 260
  95. # define BREG 261
  96. # define MREG 262
  97. # define NREG 263
  98. # define RREG 264
  99. # define XREG 265
  100. # define YREG 266
  101. # define OP 267
  102. # define OPA 268
  103. # define OPP 269
  104. # define OP_JCC 270
  105. # define OP_JSCC 271
  106. # define OP_TCC 272
  107. # define SYM 273
  108. # define STRING 274
  109. # define CHAR 275
  110. # define COMMENT 276
  111. # define XMEM 277
  112. # define YMEM 278
  113. # define LMEM 279
  114. # define PMEM 280
  115. # define AAAA 281
  116. # define A10 282
  117. # define BBBB 283
  118. # define B10 284
  119. # define AABB 285
  120. # define BBAA 286
  121. # define XXXX 287
  122. # define YYYY 288
  123. # define SR 289
  124. # define MR 290
  125. # define CCR 291
  126. # define OMR 292
  127. # define SP 293
  128. # define SSH 294
  129. # define SSL 295
  130. # define LA 296
  131. # define LC 297
  132. # define EOL 298
  133. # define EOS 299
  134. # define OP_ABS 300
  135. # define OP_ADC 301
  136. # define OP_ADD 302
  137. # define OP_ADDL 303
  138. # define OP_ADDR 304
  139. # define OP_ASL 305
  140. # define OP_ASR 306
  141. # define OP_CLR 307
  142. # define OP_CMP 308
  143. # define OP_CMPM 309
  144. # define OP_DIV 310
  145. # define OP_MAC 311
  146. # define OP_MACR 312
  147. # define OP_MPY 313
  148. # define OP_MPYR 314
  149. # define OP_NEG 315
  150. # define OP_NORM 316
  151. # define OP_RND 317
  152. # define OP_SBC 318
  153. # define OP_SUB 319
  154. # define OP_SUBL 320
  155. # define OP_SUBR 321
  156. # define OP_TFR 322
  157. # define OP_TST 323
  158. # define OP_AND 324
  159. # define OP_ANDI 325
  160. # define OP_EOR 326
  161. # define OP_LSL 327
  162. # define OP_LSR 328
  163. # define OP_NOT 329
  164. # define OP_OR 330
  165. # define OP_ORI 331
  166. # define OP_ROL 332
  167. # define OP_ROR 333
  168. # define OP_BCLR 334
  169. # define OP_BSET 335
  170. # define OP_BCHG 336
  171. # define OP_BTST 337
  172. # define OP_DO 338
  173. # define OP_ENDDO 339
  174. # define OP_LUA 340
  175. # define OP_MOVE 341
  176. # define OP_MOVEC 342
  177. # define OP_MOVEM 343
  178. # define OP_MOVEP 344
  179. # define OP_ILLEGAL 345
  180. # define OP_INCLUDE 346
  181. # define OP_JMP 347
  182. # define OP_JCLR 348
  183. # define OP_JSET 349
  184. # define OP_JSR 350
  185. # define OP_JSCLR 351
  186. # define OP_JSSET 352
  187. # define OP_NOP 353
  188. # define OP_REP 354
  189. # define OP_RESET 355
  190. # define OP_RTI 356
  191. # define OP_RTS 357
  192. # define OP_STOP 358
  193. # define OP_SWI 359
  194. # define OP_WAIT 360
  195. # define OP_EQU 361
  196. # define OP_ORG 362
  197. # define OP_DC 363
  198. # define OP_END 364
  199. # define OP_PAGE 365
  200. # define OP_PSECT 366
  201. # define OP_ALIGN 367
  202. # define SHL 368
  203. # define SHR 369
  204. #define yyclearin yychar = -1
  205. #define yyerrok yyerrflag = 0
  206. extern int yychar;
  207. extern short yyerrflag;
  208. #ifndef YYMAXDEPTH
  209. #define YYMAXDEPTH 150
  210. #endif
  211. YYSTYPE yylval, yyval;
  212. # define YYERRCODE 256
  213.  
  214. # line 1579 "a56.y"
  215.  
  216.  
  217. #include <stdio.h>
  218.  
  219. int yydebug;
  220.  
  221. struct n binary_op(a1, op, a2)
  222. struct n a1, a2;
  223. int op;
  224. {
  225.     struct n result;
  226.  
  227.     if(a1.type == UNDEF || a2.type == UNDEF) {
  228.     result.type = UNDEF;
  229.     return result;
  230.     }
  231.  
  232.     /* promote to float automatically */
  233.  
  234.     if(a1.type != a2.type) {
  235.     if(a1.type == INT) {
  236.         a1.val.f = a1.val.i;    /* truncate */
  237.         a1.type = FLT;
  238.     } else {
  239.         a2.val.f = a2.val.i;    /* truncate */
  240.     }
  241.     }
  242.     result.type = a1.type;
  243.  
  244.     /* do the op */
  245.  
  246.     if(result.type == INT) {
  247.     switch(op) {
  248.         case '+':    result.val.i = a1.val.i + a2.val.i; break;
  249.         case '-':    result.val.i = a1.val.i - a2.val.i; break;
  250.         case '*':    result.val.i = a1.val.i * a2.val.i; break;
  251.         case '/':    result.val.i = a1.val.i / a2.val.i; break;
  252.         case '%':    result.val.i = a1.val.i % a2.val.i; break;
  253.         case SHL:    result.val.i = a1.val.i << a2.val.i; break;
  254.         case SHR:    result.val.i = a1.val.i >> a2.val.i; break;
  255.         case '|':    result.val.i = a1.val.i | a2.val.i; break;
  256.         case '&':    result.val.i = a1.val.i & a2.val.i; break;
  257.         case '^':    result.val.i = a1.val.i ^ a2.val.i; break;
  258.     }
  259.     } else {
  260.     switch(op) {
  261.         case '+':    result.val.f = a1.val.f + a2.val.f; break;
  262.         case '-':    result.val.f = a1.val.f - a2.val.f; break;
  263.         case '*':    result.val.f = a1.val.f * a2.val.f; break;
  264.         case '/':    result.val.f = a1.val.f / a2.val.f; break;
  265.         case '%':    result.val.f = (int)a1.val.f % (int)a2.val.f; break;
  266.         case SHL:    result.val.f = (int)a1.val.f << (int)a2.val.f; break;
  267.         case SHR:    result.val.f = (int)a1.val.f >> (int)a2.val.f; break;
  268.         case '|':    result.val.f = (int)a1.val.f | (int)a2.val.f; break;
  269.         case '&':    result.val.f = (int)a1.val.f & (int)a2.val.f; break;
  270.         case '^':    result.val.f = (int)a1.val.f ^ (int)a2.val.f; break;
  271.     }
  272.     }
  273.  
  274.     return result;
  275. }
  276.  
  277. struct n unary_op(op, a1)
  278. int op;
  279. struct n a1;
  280. {
  281.     struct n result;
  282.  
  283.     if(a1.type == UNDEF) {
  284.     result.type = UNDEF;
  285.     return result;
  286.     }
  287.  
  288.     result.type = a1.type;
  289.  
  290.     /* do the op */
  291.  
  292.     if(result.type == INT) {
  293.     switch(op) {
  294.         case '-':    result.val.i = -a1.val.i; break;
  295.         case '~':    result.val.i = ~a1.val.i; break;
  296.     }
  297.     } else {
  298.     switch(op) {
  299.         case '-':    result.val.f = -a1.val.f; break;
  300.         case '~':    result.val.f = ~(int)a1.val.f; break;
  301.     }
  302.     }
  303.  
  304.     return result;
  305. }
  306.  
  307. n2int(n)
  308. struct n n;
  309. {
  310.     if(n.type == UNDEF)
  311.     return UNDEF;
  312.     else if(n.type == INT)
  313.     return n.val.i;
  314.     else
  315.     return n.val.f;
  316. }
  317.  
  318. n2frac(n)
  319. struct n n;
  320. {
  321.     double adval = n.val.f >= 0.0 ? n.val.f : -n.val.f;
  322.  
  323.     if(n.type == UNDEF)
  324.     return UNDEF;
  325.     else if(n.type == INT)
  326.     return n.val.i;
  327.  
  328.     adval -= (double)(int)adval;
  329.     adval *= (double)0x800000;
  330.     adval += 0.5;
  331.  
  332.     if(n.val.f >= 0.0)
  333.     return adval;
  334.     else
  335.     return -adval;
  336. }
  337.  
  338. extern struct {int n; char *name;} tok_tab[];
  339. extern int n_tok;
  340.  
  341. char *tok_print(tok)
  342. int tok;
  343. {
  344.     int i;
  345.     static char buf[32];
  346.  
  347.     if(tok < 256) {
  348.     sprintf(buf, "'%c'", tok);
  349.     return(buf);
  350.     } else {
  351.     for(i = 0; i < n_tok; i++) {
  352.         if(tok == tok_tab[i].n)
  353.         return(tok_tab[i].name);
  354.     }
  355.     }
  356.     return("<unknown>");
  357. }
  358.  
  359. yyerror(s, a0, a1, a2, a3)
  360. char *s, *a0, *a1, *a2, *a3;
  361. {
  362.     extern int error;
  363.     char buf[1024];
  364.  
  365.     error++;
  366.     sprintf(buf, s, a0, a1, a2, a3);
  367.  
  368.     if(pass == 2) {
  369.     fprintf(stderr, "%s: line %d: %s (tok=%s)\n", curfile, curline,
  370.         buf, tok_print(yychar));
  371.     fprintf(stderr, "%s\n", inline); 
  372.     printf("%s: line %d: %s (tok=%s)\n", curfile, curline,
  373.         buf, tok_print(yychar));
  374. #if 0
  375.     printf("%s\n", inline); 
  376. #endif
  377.     }
  378. }
  379.  
  380. char *luntab(s)
  381. char *s;
  382. {
  383.     static char buf[256];
  384.  
  385.     strcpy(buf, s);
  386.  
  387.     untab(buf);
  388.     return(buf);
  389. }
  390. short yyexca[] ={
  391. -1, 1,
  392.     0, -1,
  393.     270, 32,
  394.     271, 32,
  395.     272, 32,
  396.     298, 6,
  397.     299, 6,
  398.     300, 32,
  399.     301, 32,
  400.     302, 32,
  401.     303, 32,
  402.     304, 32,
  403.     305, 32,
  404.     306, 32,
  405.     307, 32,
  406.     308, 32,
  407.     309, 32,
  408.     310, 32,
  409.     311, 32,
  410.     312, 32,
  411.     313, 32,
  412.     314, 32,
  413.     315, 32,
  414.     316, 32,
  415.     317, 32,
  416.     318, 32,
  417.     319, 32,
  418.     320, 32,
  419.     321, 32,
  420.     322, 32,
  421.     323, 32,
  422.     324, 32,
  423.     325, 32,
  424.     326, 32,
  425.     327, 32,
  426.     328, 32,
  427.     329, 32,
  428.     330, 32,
  429.     331, 32,
  430.     332, 32,
  431.     333, 32,
  432.     334, 32,
  433.     335, 32,
  434.     336, 32,
  435.     337, 32,
  436.     338, 32,
  437.     339, 32,
  438.     340, 32,
  439.     341, 32,
  440.     342, 32,
  441.     343, 32,
  442.     344, 32,
  443.     345, 32,
  444.     347, 32,
  445.     348, 32,
  446.     349, 32,
  447.     350, 32,
  448.     351, 32,
  449.     352, 32,
  450.     353, 32,
  451.     354, 32,
  452.     355, 32,
  453.     356, 32,
  454.     357, 32,
  455.     358, 32,
  456.     359, 32,
  457.     360, 32,
  458.     363, 32,
  459.     -2, 0,
  460. -1, 9,
  461.     298, 35,
  462.     299, 35,
  463.     -2, 31,
  464.     };
  465. # define YYNPROD 286
  466. # define YYLAST 1345
  467. short yyact[]={
  468.  
  469.  134, 479, 221, 222, 336, 219, 345, 282, 277, 434,
  470.  119, 338, 284, 281, 106, 280,  20, 283,  17,  18,
  471.  110, 399, 133, 215, 216,  97, 234, 396, 439, 115,
  472.  220, 435, 436, 437, 390, 182, 183, 400, 282, 277,
  473.  176, 177, 395, 284, 281, 371, 280, 389, 283, 282,
  474.  277, 181, 131, 180, 284, 281, 173, 280, 172, 283,
  475.  422, 516, 174, 175, 276, 204,  20, 205, 104, 521,
  476.  241, 245, 187, 102, 188, 112, 113, 114, 111, 203,
  477.  274, 522, 139, 140, 116, 256, 258, 262, 300, 267,
  478.  301, 270, 242, 246, 275, 276, 240, 244,  98,  99,
  479.  100,  96, 109, 460, 459, 511, 276, 253, 490, 261,
  480.  353, 254, 302, 263, 481, 268, 282, 277, 271, 272,
  481.  369, 284, 281, 503, 280, 275, 283, 227, 502, 225,
  482.  288, 218, 228, 457, 458, 210, 210, 210, 210, 293,
  483.  304, 305, 297, 282, 277, 198, 199, 223, 284, 281,
  484.  461, 280, 226, 283, 103,  98,  99, 100, 232, 214,
  485.  233, 202, 528, 193, 294, 209, 282, 298, 197, 247,
  486.  455, 284, 454, 276, 282, 277, 283, 523, 132, 284,
  487.  281, 282, 280, 166, 283, 167, 284, 281, 504, 280,
  488.  517, 283, 514, 512, 229, 230, 231, 510, 505, 499,
  489.  276, 498, 494, 275, 468, 441, 430, 425, 424, 224,
  490.  195, 196, 423, 103, 206, 207, 208, 420, 200, 201,
  491.  217, 101, 211, 212, 213, 236, 237, 238, 282, 277,
  492.  275, 417, 121, 284, 281, 462, 280, 194, 283, 414,
  493.  264, 248, 248, 248, 248, 328, 327, 413, 412, 334,
  494.  332, 249, 250, 251, 388, 387, 337, 339, 405, 386,
  495.  406, 342, 382, 381, 376, 346, 375, 348, 358, 357,
  496.  356, 355, 354, 329, 352, 351, 350, 333, 186, 189,
  497.  190, 191, 192, 344, 343,  98,  99, 100, 341, 335,
  498.  347, 331, 349, 374, 330, 326, 377, 380, 321, 320,
  499.  319, 107, 373, 108, 235, 372, 273, 318, 317, 316,
  500.  315, 314, 285, 286, 287, 313, 312, 311, 378, 227,
  501.  289, 225, 310, 138, 228, 309, 308, 409, 307, 306,
  502.  296, 295, 292, 410, 411, 291, 416, 290, 279, 278,
  503.  385, 130, 129, 171,  98,  99, 100, 299, 128, 408,
  504.  127, 427, 428, 429, 126, 431, 125, 433, 415, 124,
  505.  107, 123, 108, 265, 419, 260, 421, 179, 438, 279,
  506.  278, 257, 252, 426, 243, 442, 443, 444, 447, 178,
  507.  279, 278, 452, 453, 448, 450,  19, 239, 391, 392,
  508.  393, 394, 440,  92, 397, 398,  95,  91, 401, 402,
  509.  403, 404,  29,  10, 446, 103, 184, 185, 117, 449,
  510.  451, 464, 467,  28,  27, 469, 470, 471, 478,  26,
  511.  466, 475, 122, 483, 485, 486, 487, 473, 346, 484,
  512.   25,  24, 488, 322, 480, 432, 480, 287, 285, 465,
  513.  476,  23, 118, 482, 495, 299, 474, 279, 278, 500,
  514.   21, 497,   8, 347,   7, 340, 493, 489, 137,   5,
  515.    3,   2, 227, 138, 225,   1, 456, 228, 266, 269,
  516.  165, 506, 303, 150, 279, 278, 472, 463, 135, 337,
  517.  339, 507, 223, 508, 509, 359, 360, 361, 362, 363,
  518.  364, 365, 366, 367, 368, 105, 235, 480, 370, 515,
  519.    0, 121, 513,   0,   0, 279, 278, 518, 519, 164,
  520.  383, 384,   0,   0,   0, 524,   0,   0, 526,   0,
  521.    0,   0, 525,   0, 530, 520,   0,   0, 529, 532,
  522.   62,  61,  88, 531,   0, 287,  98,  99, 100,   0,
  523.    0, 168, 169, 170,   0,   0,   0,   0, 103,   0,
  524.  418,   0, 107,   0, 108,   0,   0,   0,   0,   0,
  525.   53,  59,  35,  41,  45,  55,  51,  42,  38,  39,
  526.   90,  32,  33,  30,  31,  57,  89,  40,  60,  34,
  527.   43,  47,  37,  46,  48,  94,  50,  56,  52,  44,
  528.   49,  93,  58,  54,  83,  82,  81,  80,  70,  71,
  529.   87,  36,  86,  85,  84,  77, 235,  64,  68,  67,
  530.   63,  66,  65,  79,  69,  74,  78,  75,  72,  76,
  531.   73,   0,   0,  22,   4,   0,   0,   0,   0,   0,
  532.    0,   0,   0,   0, 143, 144, 149, 148, 147, 141,
  533.  142,   9,   0,   0,   6, 235,   0, 340,   0, 491,
  534.  492, 139, 140,   0, 477, 145, 151, 146, 152, 155,
  535.  156, 153, 154, 157,   0,   0, 158, 159, 160, 161,
  536.  162, 163,   0,   0,   0,   0,   0,   0,   0,  98,
  537.   99, 100,   0, 143, 144, 149, 148, 147, 141, 142,
  538.    0,   0,   0,   0,   0, 107,   0, 108,   0,   0,
  539.  139, 140, 136,   0, 145, 151, 146, 152, 155, 156,
  540.  153, 154, 157,   0,  15, 158, 159, 160, 161, 162,
  541.  163, 143, 144, 149, 148, 147, 141, 142,   0,   0,
  542.   13,   0,  16,  14,  12,  11,   0,   0, 139, 140,
  543.    0, 255, 145, 151, 146, 152, 155, 156, 153, 154,
  544.  157,   0,   0, 158, 159, 160, 161, 162, 163, 143,
  545.  144, 149, 148, 147, 141, 142,   0,   0,   0,   0,
  546.    0,   0,   0,   0,   0,   0, 139, 140, 379,   0,
  547.  145, 151, 146, 152, 155, 156, 153, 154, 157,   0,
  548.    0, 158, 159, 160, 161, 162, 163,   0,   0,   0,
  549.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  550.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  551.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  552.    0, 143, 144, 149, 148, 147, 141, 142,   0,   0,
  553.    0,   0,   0,   0,   0,   0,   0,   0, 139, 140,
  554.    0,   0, 145, 151, 146, 152, 155, 156, 153, 154,
  555.  157,   0,   0, 158, 159, 160, 161, 162, 163,   0,
  556.  143, 144, 149, 148, 147, 141, 142,   0,   0,   0,
  557.    0,   0,   0,   0,   0,   0,   0,   0, 445,   0,
  558.    0, 145, 151, 146, 152, 155, 156, 153, 154, 157,
  559.    0,   0, 158, 159, 160, 161, 162, 163, 143, 144,
  560.  149, 148, 147, 141, 142,   0,   0,   0,   0,   0,
  561.    0,   0,   0,   0,   0, 139, 140,   0,   0, 145,
  562.  151, 146, 152, 155, 156, 153, 154, 157,   0,   0,
  563.  158, 159, 160, 161, 162, 163, 143, 144, 149, 148,
  564.  147, 141, 142, 227,   0, 225, 104,   0, 228,   0,
  565.    0, 102,   0,   0, 527,   0,   0, 145, 151, 146,
  566.  152, 155, 156, 153, 154, 157,   0,   0, 158, 159,
  567.  160, 161, 162, 163, 143, 144, 149, 148, 147, 141,
  568.  142, 104,   0, 225,   0,   0, 102,   0,   0,   0,
  569.    0,   0, 501,   0,   0, 145, 151, 146, 152, 155,
  570.  156, 153, 154, 157,   0,   0, 158, 159, 160, 161,
  571.  162, 163, 143, 144, 149, 148, 147, 141, 142, 104,
  572.    0,   0, 104,   0, 102,   0,   0, 102,   0, 103,
  573.  496,   0, 103, 145, 151, 146, 152, 155, 156, 153,
  574.  154, 157, 300,   0, 158, 159, 160, 161, 162, 163,
  575.  143, 144, 149, 148, 147, 141, 142, 104,   0,   0,
  576.    0, 104, 102, 323,   0,   0, 102, 103,   0,   0,
  577.  259, 145, 151, 146, 152, 155, 156, 153, 154, 157,
  578.    0,   0, 158, 159, 160, 161, 162, 163, 143, 144,
  579.  149, 148, 147, 141, 142,   0, 104,   0,   0, 325,
  580.    0, 102,   0,   0, 102, 103,   0,   0, 103, 145,
  581.  151, 146, 152, 155, 156, 153, 154, 157,   0,   0,
  582.  158, 159, 160, 161, 162, 163,   0,   0,   0,   0,
  583.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  584.    0,   0,   0, 103,   0,   0,   0, 103,   0,   0,
  585.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  586.   98,  99, 100,  98,  99, 100,   0,   0,   0,   0,
  587.  407,   0,   0,   0,   0,   0, 107,   0, 108, 107,
  588.    0, 108, 103,   0,   0, 103,   0,   0,   0,   0,
  589.    0,   0,   0,   0,   0,   0,   0,   0,  98,  99,
  590.  100,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  591.    0,   0,   0,   0, 107,   0, 108,   0,   0,   0,
  592.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  593.    0,   0,   0,   0,   0,   0,  98,  99, 100,  98,
  594.   99, 100,   0,   0,   0,   0,   0,   0,   0,   0,
  595.    0,   0, 107, 120, 108, 107,   0, 108,   0,   0,
  596.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  597.    0,   0,   0,   0,  98,  99, 100,   0,  98,  99,
  598.  100, 324,   0,   0,   0,   0,   0,   0,   0,   0,
  599.  107,   0, 108,   0, 107,   0, 108,   0,   0,   0,
  600.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  601.    0,   0,   0,  98,  99, 100,  98,  99, 100,   0,
  602.    0,   0,   0,   0,   0,   0,   0,   0,   0, 107,
  603.    0, 108, 107,   0, 108 };
  604. short yypact[]={
  605.  
  606. -1000, 368,-1000,-280,-1000,-1000,-1000,-210, 260,-260,
  607. -102,1066,-171,-202,-102,-190,-1000,-1000,-1000,-1000,
  608. -1000,-210, 989,-1000,-1000, 423,-1000,-1000,-1000,-1000,
  609.  140, 140, 140, 140,-225,-225,-1000,-230,-230,-230,
  610. -209,-209,-209,-209,-209,-209,-209,-209,-120,-120,
  611. -120,-216,-216,-216,-216,-216,-216,-216,-216,-264,
  612. -264, 422, 422, 422, 422, 269, 269, 269, 269, 571,
  613.  571,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  614.  269, 269, 269, 269, 461, 800, 571, 283, 838,-149,
  615.  838, 269, 269,-1000,-1000,-1000,1066,-194,-1000,-1000,
  616. -1000, 106,1066,1066,1066,-1000,-1000,-1000,-1000,-202,
  617. 1066,-1000,-1000,-1000,-1000, 293,-1000,-1000, 291,-1000,
  618. -1000, 106,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  619. -1000, 288,-1000, 422, 287, 286, 422,  28,-152,-1000,
  620. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  621. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  622. -1000,-1000,-1000,-1000,-1000,-125,-1000,-1000,-1000,-1000,
  623. -1000,-1000, 285, 284, 282, 281, 278, 273,-1000,-1000,
  624.  272, 271, 267, 266,-1000,-1000,-1000, 265, 264,-1000,
  625. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 263, 256,
  626. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  627. -1000,-1000,-1000,-1000,-1000, 255, 254,-1000,-1000,-1000,
  628. -1000,-1000,-1000,1031, 106,-1000,-1000,1027,1069,-1000,
  629. -1000,-1000,-1000, 251,-1000, 992,-1000,-1000,-1000,-1000,
  630. -1000,-1000, 422,-1000, 250, 247, 422,-1000, 245,-1000,
  631. -1000,-1000,-1000, 279, 244, 913, 240,-1000, 239, 422,
  632. -1000, 422, 232, 231, 230,-1000,-154, 228, 227,-1000,
  633.  226, 225, 224, 106,-1000,1066,1066,1066,1066,1066,
  634. 1066,1066,1066,1066,1066,-1000,-1000,  79,1066,   1,
  635. -102, 989, 838, 222, 220, 499, 838, 219, 218, 106,
  636. 1066,1066, 299, 215, 211, 210,-234,-249,-216,-216,
  637. -216,-216,-239,-256,-216,-216,-262,-244,-216,-216,
  638. -216,-216, 106,-1000, 217, 916, 648,-1000,-1000,-1000,
  639.  951, 951, 204, 203, 195, 648, 187,-1000,-1000,-1000,
  640. 1066,-195, 173,-195,-220, 168,-1000,-1000, 164, 163,
  641.  648, 838, 838, 162, 838,-216, 838,-259,-259,  12,
  642.  137, 144, 191, 191, 129, 129,-1000,-1000,-1000,-1000,
  643.  -30,-202, 161,-1000, 838, 838, 838, 610, 422, 422,
  644. -1000, 838, 838, 106, 106, 127,-216,-132,-162,-1000,
  645. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  646. -1000,-1000,-1000,-1000,-1000, 127,-113, 194,  87, 160,
  647. -1000,-1000, 951, 951, 951,  87,-1000, 374, 106,-159,
  648. -195,-159, 422, 838, 838, 838, 422,-1000,-1000,-1000,
  649. -156,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,1066,
  650. 1066,-102, 158, 762,-1000, 913, 157, 155, 724,-1000,
  651. -1000,-1000,-1000,-1000,-135,-140,-1000,-1000,-1000,-1000,
  652. -1000, 147,-1000, 154,-1000,-1000,-1000,-1000, 951,-1000,
  653. -1000,-1000,-1000,-1000,-1000,-1000, 279, 913,-1000,-1000,
  654. -1000,-1000,-159,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  655. -1000, 106, 106, 153,-161, 149, 913, 148, 838,-217,
  656.  146, 913,-1000,-1000,-1000, 951,-1000,-1000,-1000,-1000,
  657. -102,-1000,-197, 133, 838,-1000, 913, 686, 118,-1000,
  658. -1000,-1000, 913, 838,-1000,-1000,-1000, 913, 838,-1000,
  659. -1000,-1000,-1000 };
  660. short yypgo[]={
  661.  
  662.    0,  14,   1, 495, 209,  26, 478,   2,  30,  11,
  663.   79,  22,   5, 160, 477,   3, 476,   6, 131, 152,
  664.  473, 343, 367, 237, 163, 168, 161, 165, 159, 509,
  665.  472, 470, 469,   9, 468,  20,   0,   4, 465, 461,
  666.  460, 459, 454, 386, 452, 450, 442,  10, 441, 431,
  667.  430, 422, 419, 414, 413, 402, 397, 393, 158, 387,
  668.  374, 169, 372, 371, 365, 363, 361, 359, 356, 354,
  669.  350, 348, 342, 341 };
  670. short yyr1[]={
  671.  
  672.    0,  38,  38,  39,  39,  39,  40,  40,  40,  40,
  673.   40,  40,  41,  42,  42,  42,  42,  42,  42,  42,
  674.   42,  42,  42,  46,  46,  47,  47,  35,  35,  35,
  675.   35,  44,  44,  45,  43,  43,  48,  48,  48,  50,
  676.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  677.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  678.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  679.   29,  31,  31,  31,  30,  30,  30,  30,  21,  21,
  680.   21,  21,  21,  21,  22,  22,  22,  22,  23,  23,
  681.   23,  23,  24,  25,  25,  26,  27,  28,  28,  10,
  682.   10,  49,  49,  49,  49,  55,  55,  55,  55,  56,
  683.   56,  57,  57,  52,  52,  52,  52,  52,  52,  52,
  684.   52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
  685.   52,  52,  60,  60,  60,  60,  60,  59,  59,  59,
  686.   59,  59,  58,  58,  14,  14,  14,  14,  53,  53,
  687.   53,  53,  61,  61,  16,  16,  16,  54,  54,  54,
  688.   54,  54,  65,  65,  34,  32,  64,  64,  64,  64,
  689.   64,  64,  62,  62,  62,  62,  62,  62,  37,  37,
  690.   37,  63,  63,  13,  11,  11,  17,  17,  18,  18,
  691.   12,  12,  15,  15,  15,  15,  19,  19,  19,  19,
  692.   36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
  693.   36,  36,  36,  36,  36,  36,  20,  20,  20,  20,
  694.   20,  20,  20,  33,  33,  33,  51,  51,  51,  51,
  695.   51,  51,  51,  51,  66,  71,  67,  68,  68,  68,
  696.   68,  68,  69,  69,  69,  70,  70,  70,  73,  73,
  697.   73,  73,  72,  72,  72,  72,   1,   1,   1,   5,
  698.    5,   6,   7,   7,   8,   8,   9,   2,   2,   3,
  699.    3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
  700.    4,   4,   4,   4,   4,   4 };
  701. short yyr2[]={
  702.  
  703.    0,   0,   2,   2,   2,   1,   0,   1,   1,   2,
  704.    3,   2,   3,   3,   2,   2,   6,   3,   6,   3,
  705.    8,   2,   1,   3,   1,   1,   1,   1,   1,   1,
  706.    1,   1,   0,   1,   1,   0,   1,   1,   2,   2,
  707.    2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
  708.    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
  709.    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
  710.    4,   1,   1,   0,   3,   3,   3,   3,   3,   3,
  711.    3,   3,   3,   3,   3,   3,   3,   3,   1,   1,
  712.    3,   3,   1,   3,   3,   1,   1,   3,   3,   1,
  713.    1,   1,   1,   1,   1,   4,   2,   4,   4,   1,
  714.    1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
  715.    2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
  716.    1,   1,   3,   3,   4,   4,   4,   1,   1,   2,
  717.    2,   2,   6,   5,   1,   1,   1,   1,   2,   2,
  718.    2,   2,   4,   3,   1,   1,   1,   2,   2,   2,
  719.    4,   2,   1,   4,   3,   3,   4,   4,   3,   4,
  720.    4,   3,   5,   4,   5,   5,   4,   4,   1,   1,
  721.    1,   4,   4,   1,   1,   1,   1,   1,   1,   1,
  722.    1,   1,   1,   3,   5,   4,   5,   5,   4,   4,
  723.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  724.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  725.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  726.    1,   1,   1,   1,   3,   3,   1,   4,   4,   4,
  727.    4,   3,   7,   6,   7,   7,   6,   7,   4,   4,
  728.    4,   4,   8,   8,   8,   8,   1,   1,   1,   2,
  729.    3,   3,   1,   1,   2,   2,   2,   1,   1,   1,
  730.    1,   1,   3,   3,   3,   3,   3,   3,   3,   3,
  731.    3,   3,   2,   2,   3,   1 };
  732. short yychk[]={
  733.  
  734. -1000, -38, -39, -40, 256, -41, 276, -42, -44, 273,
  735.   35, 367, 366, 362, 365, 346, 364, 298, 299, -43,
  736.  276, -45, 363, -48, -49, -50, -52, -53, -54, -55,
  737.  313, 314, 311, 312, 319, 302, 341, 322, 308, 309,
  738.  317, 303, 307, 320, 329, 304, 323, 321, 324, 330,
  739.  326, 306, 328, 300, 333, 305, 327, 315, 332, 301,
  740.  318, 271, 270, 350, 347, 352, 351, 349, 348, 354,
  741.  338, 339, 358, 360, 355, 357, 359, 345, 356, 353,
  742.  337, 336, 335, 334, 344, 343, 342, 340, 272, 316,
  743.  310, -56, -57, 331, 325, -43, 361,  -1, 257, 258,
  744.  259,  -4,  45, 126,  40,  -3,  -1, 273, 275, 273,
  745.  -35, 280, 277, 278, 279,  -1, 274, -43, -46, -47,
  746.  274,  -4, -51, -66, -67, -68, -69, -70, -71, -72,
  747.  -73,  -5, -19, -11, -36,  -6, 279,  35,  40, 277,
  748.  278, 265, 266, 260, 261, 281, 283, 264, 263, 262,
  749.  -20, 282, 284, 287, 288, 285, 286, 289, 292, 293,
  750.  294, 295, 296, 297, -29, -31,  43,  45, -29, -29,
  751.  -29, -21, 283, 281, 287, 288, 265, 266, -21, -22,
  752.  283, 281, 265, 266, -22, -22, -23, 281, 283, -23,
  753.  -23, -23, -23, -24, -23, -24, -24, -25, 265, 266,
  754.  -25, -25, -26, -10, 281, 283, -26, -26, -26, -27,
  755.  -10, -27, -27, -27, -28, 287, 288, -28, -18, -12,
  756.   -8,  -7, -15,  60,  -4,  42, -19,  40,  45, -18,
  757.  -18, -18, -58, -13,  -5,  35, -58, -58, -58, -59,
  758.   -5, -36, -11, -60,  -5, -36, -11, -61, -13, -61,
  759.  -61, -61, -62, -11,  -5, 280, -36, -63, -36, 280,
  760.  -64, -11, -36,  -5, -19, -65, -34, -36, 264, -32,
  761.  -36,  -5,  -5,  -4, 274, 124,  94,  38, 369, 368,
  762.   45,  43,  37,  47,  42,  -4,  -4,  -4, -35,  -4,
  763.   44,  44,  44, -12,  -8,  44,  44, -12,  -8,  -4,
  764.   60,  62, 264, -30, 265, 266,  44,  44,  44,  44,
  765.   44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
  766.   44,  44,  -4,  42, 264,  40,  44, -15,  -7,  -8,
  767.   44,  44, -15,  -8,  -7,  44, -37,  -7,  -9, -15,
  768.  368,  44, -12,  44,  44, -17, -12,  -8, -12,  -8,
  769.   44,  44,  44, 264,  44,  44,  44,  44,  44,  -4,
  770.   -4,  -4,  -4,  -4,  -4,  -4,  -4,  -4,  -4,  41,
  771.   -4,  44,  -1, -47, -36,  44,  44, -36, -11, 279,
  772.  -36,  44,  44,  -4,  -4,  41,  44,  44,  44, 281,
  773.  283, -10, -10, -10, -10, 281, 283, -10, -10, 283,
  774.  281, -10, -10, -10, -10,  41,  43, 264, -11, -36,
  775.   -7,  -7,  44,  44,  44, -11, -36,  44,  -4, -11,
  776.   44, -11, 280,  44,  44,  44, -11, -36, -36, -36,
  777.   44, -36, -10, -36, -33, 290, 291, 292, -33,  58,
  778.  -35,  44, -36, -36, -36, 278,  -5, -36, -12,  -8,
  779.  -12,  -8, -36, -36,  45,  43, -10, 265, 266, 266,
  780.  265, 263,  41, -14,  -7,  -8,  -9, -15,  44,  -7,
  781.   -7,  -7, -16,  -9,  -8, -12, -11, 280, -36,  -2,
  782.   -1, 273, -11,  -2, -17, -36, -36, -36, -12,  -8,
  783.  264,  -4,  -4,  -1,  44, -36, 278, -12,  44,  44,
  784.  -36, 278, 263, 263,  41,  44,  -7, -37, -12,  -2,
  785.   44, 266,  44, -12,  44, -36, 278,  44, -12,  -7,
  786.   -1, 266, 278,  44, -36, -12, -36, 278,  44, -12,
  787.  -36, -12, -36 };
  788. short yydef[]={
  789.  
  790.    1,  -2,   2,   0,   5,   7,   8,  35,   0,  -2,
  791.    0,   0,   0,   0,   0,   0,  22,   3,   4,   9,
  792.   34,  35,   0,  33,  36,  37, 101, 102, 103, 104,
  793.   73,  73,  73,  73,   0,   0,  45,   0,   0,   0,
  794.    0,   0,   0,   0,   0,   0,   0,   0, 111, 109,
  795.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  796.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  797.    0, 123, 124, 125, 126, 127, 128, 129, 130, 131,
  798.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  799.    0,   0,   0, 110, 112,  11,   0,   0, 256, 257,
  800.  258,  14,   0,   0,   0, 285, 269, 270, 271,  15,
  801.    0,  27,  28,  29,  30,   0,  21,  10,  19,  24,
  802.   25,  26,  38, 226, 227, 228, 229, 230, 231, 232,
  803.  233,   0, 236,   0,   0,   0,   0,   0,   0, 184,
  804.  185, 200, 201, 202, 203, 204, 205, 206, 207, 208,
  805.  209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
  806.  219, 220, 221, 222,  39,   0,  71,  72,  40,  41,
  807.   42,  43,   0,   0,   0,   0,   0,   0,  44,  46,
  808.    0,   0,   0,   0,  47,  48,  49,  88,  89,  50,
  809.   51,  52,  53,  54,  92,  55,  56,  57,   0,   0,
  810.   58,  59,  60,  95,  99, 100,  61,  62,  63,  64,
  811.   96,  65,  66,  67,  68,   0,   0,  69, 113, 188,
  812.  189, 190, 191,   0, 262, 263, 192,   0,   0, 114,
  813.  115, 116, 117,   0, 183,   0, 118, 119, 120, 121,
  814.  137, 138,   0, 122,   0,   0,   0, 148,   0, 149,
  815.  150, 151, 157,   0,   0,   0,   0, 158,   0,   0,
  816.  159,   0,   0,   0,   0, 161, 162,   0,   0, 106,
  817.    0,   0,   0,  13,  12,   0,   0,   0,   0,   0,
  818.    0,   0,   0,   0,   0, 282, 283,   0,   0,  17,
  819.    0,   0,   0,   0,   0,   0,   0,   0,   0, 259,
  820.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  821.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  822.    0,   0, 264, 265,   0,   0,   0, 139, 140, 141,
  823.    0,   0,   0,   0,   0,   0,   0, 178, 179, 180,
  824.    0,   0,   0,   0,   0,   0, 186, 187,   0,   0,
  825.    0,   0,   0,   0,   0,   0,   0,   0,   0, 272,
  826.  273, 274, 275, 276, 277, 278, 279, 280, 281, 284,
  827.    0,   0,   0,  23, 234,   0,   0, 235,   0,   0,
  828.  241,   0,   0, 260, 261,   0,   0,   0,   0,  78,
  829.   79,  80,  81,  82,  83,  84,  85,  86,  87,  91,
  830.   90,  93,  94,  97,  98, 193,   0,   0,   0,   0,
  831.  132, 133,   0,   0,   0,   0, 153,   0, 266,   0,
  832.    0,   0,   0,   0,   0,   0,   0, 171, 168, 160,
  833.    0, 164, 105, 165, 107, 223, 224, 225, 108,   0,
  834.    0,   0,   0, 237, 238,   0,   0,   0, 239, 240,
  835.  249, 251, 248, 250, 198, 199,  70,  74,  76,  75,
  836.   77,   0, 195,   0, 144, 145, 146, 147,   0, 134,
  837.  135, 136, 152, 154, 155, 156,   0,   0, 177, 173,
  838.  267, 268,   0, 176, 181, 182, 166, 169, 167, 170,
  839.  163,  16,  18,   0,   0,   0,   0,   0,   0,   0,
  840.    0,   0, 196, 197, 194,   0, 143, 172, 175, 174,
  841.    0, 243,   0,   0,   0, 246,   0,   0,   0, 142,
  842.   20, 242,   0,   0, 245, 247, 244,   0,   0, 253,
  843.  252, 255, 254 };
  844. #ifndef lint
  845. static char yaccpar_sccsid[] = "@(#)yaccpar    4.1    (Berkeley)    2/11/83";
  846. #endif not lint
  847.  
  848. #
  849. # define YYFLAG -1000
  850. # define YYERROR goto yyerrlab
  851. # define YYACCEPT return(0)
  852. # define YYABORT return(1)
  853.  
  854. /*    parser for yacc output    */
  855.  
  856. #ifdef YYDEBUG
  857. int yydebug = 0; /* 1 for debugging */
  858. #endif
  859. YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
  860. int yychar = -1; /* current input token number */
  861. int yynerrs = 0;  /* number of errors */
  862. short yyerrflag = 0;  /* error recovery flag */
  863.  
  864. yyparse() {
  865.  
  866.     short yys[YYMAXDEPTH];
  867.     short yyj, yym;
  868.     register YYSTYPE *yypvt;
  869.     register short yystate, *yyps, yyn;
  870.     register YYSTYPE *yypv;
  871.     register short *yyxi;
  872.  
  873.     yystate = 0;
  874.     yychar = -1;
  875.     yynerrs = 0;
  876.     yyerrflag = 0;
  877.     yyps= &yys[-1];
  878.     yypv= &yyv[-1];
  879.  
  880.  yystack:    /* put a state and value onto the stack */
  881.  
  882. #ifdef YYDEBUG
  883.     if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
  884. #endif
  885.         if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
  886.         *yyps = yystate;
  887.         ++yypv;
  888.         *yypv = yyval;
  889.  
  890.  yynewstate:
  891.  
  892.     yyn = yypact[yystate];
  893.  
  894.     if( yyn<= YYFLAG ) goto yydefault; /* simple state */
  895.  
  896.     if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
  897.     if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
  898.  
  899.     if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
  900.         yychar = -1;
  901.         yyval = yylval;
  902.         yystate = yyn;
  903.         if( yyerrflag > 0 ) --yyerrflag;
  904.         goto yystack;
  905.         }
  906.  
  907.  yydefault:
  908.     /* default state action */
  909.  
  910.     if( (yyn=yydef[yystate]) == -2 ) {
  911.         if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
  912.         /* look through exception table */
  913.  
  914.         for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
  915.  
  916.         while( *(yyxi+=2) >= 0 ){
  917.             if( *yyxi == yychar ) break;
  918.             }
  919.         if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
  920.         }
  921.  
  922.     if( yyn == 0 ){ /* error */
  923.         /* error ... attempt to resume parsing */
  924.  
  925.         switch( yyerrflag ){
  926.  
  927.         case 0:   /* brand new error */
  928.  
  929.             yyerror( "syntax error" );
  930.         yyerrlab:
  931.             ++yynerrs;
  932.  
  933.         case 1:
  934.         case 2: /* incompletely recovered error ... try again */
  935.  
  936.             yyerrflag = 3;
  937.  
  938.             /* find a state where "error" is a legal shift action */
  939.  
  940.             while ( yyps >= yys ) {
  941.                yyn = yypact[*yyps] + YYERRCODE;
  942.                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
  943.                   yystate = yyact[yyn];  /* simulate a shift of "error" */
  944.                   goto yystack;
  945.                   }
  946.                yyn = yypact[*yyps];
  947.  
  948.                /* the current yyps has no shift onn "error", pop stack */
  949.  
  950. #ifdef YYDEBUG
  951.                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
  952. #endif
  953.                --yyps;
  954.                --yypv;
  955.                }
  956.  
  957.             /* there is no state on the stack with an error shift ... abort */
  958.  
  959.     yyabort:
  960.             return(1);
  961.  
  962.  
  963.         case 3:  /* no shift yet; clobber input char */
  964.  
  965. #ifdef YYDEBUG
  966.             if( yydebug ) printf( "error recovery discards char %d\n", yychar );
  967. #endif
  968.  
  969.             if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
  970.             yychar = -1;
  971.             goto yynewstate;   /* try again in the same state */
  972.  
  973.             }
  974.  
  975.         }
  976.  
  977.     /* reduction by production yyn */
  978.  
  979. #ifdef YYDEBUG
  980.         if( yydebug ) printf("reduce %d\n",yyn);
  981. #endif
  982.         yyps -= yyr2[yyn];
  983.         yypvt = yypv;
  984.         yypv -= yyr2[yyn];
  985.         yyval = yypv[1];
  986.         yym=yyn;
  987.             /* consult goto table to find next state */
  988.         yyn = yyr1[yyn];
  989.         yyj = yypgo[yyn] + *yyps + 1;
  990.         if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
  991.         switch(yym){
  992.             
  993. case 3:
  994. # line 234 "a56.y"
  995. {substatement = 0;
  996.             if(NOT check_psect(seg, pc) && pass == 2)
  997.                 yyerror("%04X: psect violation", pc);
  998.             } break;
  999. case 4:
  1000. # line 239 "a56.y"
  1001. {substatement++;
  1002.             if(NOT check_psect(seg, pc) && pass == 2)
  1003.                 yyerror("%04X: psect violation", pc);
  1004.             } break;
  1005. case 6:
  1006. # line 248 "a56.y"
  1007. {if(pass == 2 && list_on) {
  1008.                 printf("\n");
  1009.             }} break;
  1010. case 8:
  1011. # line 253 "a56.y"
  1012. {if(pass == 2 && NOT substatement && list_on) {
  1013.                 printf("%s%s\n", spaces(0), luntab(inline));
  1014.             }} break;
  1015. case 9:
  1016. # line 257 "a56.y"
  1017. {long_symbolic_expr = FALSE;} break;
  1018. case 10:
  1019. # line 259 "a56.y"
  1020. {char *printcode();
  1021.             if(pass == 2) {
  1022.                 gencode(seg, pc, w0);
  1023.                 if(list_on) printf("%c:%04X %s %s\n", segs[seg], pc, 
  1024.                     printcode(w0), substatement ? "" :
  1025.                         luntab(inline));
  1026.                 pc++;
  1027.                 if(uses_w1) {
  1028.                     gencode(seg, pc, w1);
  1029.                     if(list_on) printf("%c:%04X %s\n", segs[seg], pc,
  1030.                                printcode(w1 & 0xFFFFFF));
  1031.                     pc++;
  1032.                 }
  1033.             } else {
  1034.                 pc++;
  1035.                 if(uses_w1)
  1036.                     pc++;
  1037.             }
  1038.             w0 = w1 = 0; uses_w1 = FALSE; 
  1039.             long_symbolic_expr = FALSE;} break;
  1040. case 11:
  1041. # line 280 "a56.y"
  1042. {sym_def(yypvt[-1].sval, INT, pc);
  1043.             free(yypvt[-1].sval);
  1044.             if(pass == 2) {
  1045.                 if(list_on) printf("%c:%04X%s%s\n", segs[seg], pc, 
  1046.                     spaces(14-8), substatement ? "" :
  1047.                         luntab(inline));
  1048.             long_symbolic_expr = FALSE;
  1049.             }} break;
  1050. case 12:
  1051. # line 292 "a56.y"
  1052. {if(strlen(yypvt[-0].sval) > 0)
  1053.                 curfile = yypvt[-0].sval;
  1054.             curline = yypvt[-1].n.val.i - 2;} break;
  1055. case 13:
  1056. # line 299 "a56.y"
  1057. {sym_def(yypvt[-2].sval, yypvt[-0].n.type, yypvt[-0].n.val.i, yypvt[-0].n.val.f);
  1058.             free(yypvt[-2].sval);
  1059.             if(pass == 2 && list_on) {
  1060.                 if(yypvt[-0].n.type == INT)
  1061.                     printf("%06X%s",
  1062.                         yypvt[-0].n.val.i & 0xFFFFFF,
  1063.                         spaces(14-6-2));
  1064.                 else
  1065.                     printf("%10g%s", yypvt[-0].n.val.f,
  1066.                         spaces(14-10-2));
  1067.                 printf("%s\n", 
  1068.                     substatement ? "" : luntab(inline));
  1069.             }} break;
  1070. case 14:
  1071. # line 313 "a56.y"
  1072. {int ival = n2int(yypvt[-0].n);
  1073.             if(yypvt[-0].n.type == UNDEF) {
  1074.                 yyerror("illegal forward reference");
  1075.             } else if (ival <= 1) {
  1076.                 yyerror("%d: illegal alignment", ival);
  1077.             } else {
  1078.                 if(pc % ival != 0)
  1079.                     pc += ival - pc % ival;
  1080.             }
  1081.             if(pass == 2 && list_on)
  1082.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1083.                     spaces(14-8), substatement ? "" : luntab(inline));
  1084.             } break;
  1085. case 15:
  1086. # line 327 "a56.y"
  1087. {struct psect *pp = find_psect(yypvt[-0].sval);
  1088.             if(NOT pp) {
  1089.                 if(pass == 2)
  1090.                     yyerror("%s: undefined psect", yypvt[-0].sval);
  1091.             } else {
  1092.                 seg = pp->seg;
  1093.                 pc = pp->pc;
  1094.                 set_psect(pp);
  1095.                 if(pass == 2 && list_on) 
  1096.                     printf("%c:%04X%s%s\n", segs[seg], pc, 
  1097.                         spaces(14-8), substatement ? "" : luntab(inline));
  1098.             }
  1099.             free(yypvt[-0].sval);} break;
  1100. case 16:
  1101. # line 341 "a56.y"
  1102. {new_psect(yypvt[-4].sval, yypvt[-3].ival, n2int(yypvt[-2].n), n2int(yypvt[-0].n));
  1103.             if(pass == 2 && list_on) 
  1104.                 printf("%c:%04X %04X%s%s\n", 
  1105.                     segs[yypvt[-3].ival], n2int(yypvt[-2].n), n2int(yypvt[-0].n), spaces(14-8+4+1), 
  1106.                     substatement ? "" : luntab(inline));
  1107.             } break;
  1108. case 17:
  1109. # line 348 "a56.y"
  1110. {pc = n2int(yypvt[-0].n);
  1111.             seg = yypvt[-1].ival;
  1112.             if(pass == 2 && list_on) 
  1113.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1114.                     spaces(14-8), substatement ? "" : luntab(inline));
  1115.             } break;
  1116. case 18:
  1117. # line 355 "a56.y"
  1118. {pc = n2int(yypvt[-3].n);
  1119.             seg = yypvt[-4].ival;
  1120.             if(pass == 2 && list_on)
  1121.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1122.                     spaces(14-8), substatement ? "" : luntab(inline));
  1123.             } break;
  1124. case 20:
  1125. # line 363 "a56.y"
  1126. {if(pass == 2 && NOT substatement && list_on) {
  1127.                 printf("%s%s\n", spaces(0), luntab(inline));
  1128.             }} break;
  1129. case 21:
  1130. # line 367 "a56.y"
  1131. {if(pass == 2 && NOT substatement && list_on) {
  1132.                 printf("%s%s\n", spaces(0), luntab(inline));
  1133.             }
  1134.             include(yypvt[-0].sval); /* free($2); */
  1135.             } break;
  1136. case 22:
  1137. # line 373 "a56.y"
  1138. {if(pass == 2 && NOT substatement && list_on) {
  1139.                 printf("%s%s\n", spaces(0), luntab(inline));
  1140.             }} break;
  1141. case 25:
  1142. # line 385 "a56.y"
  1143. {int len = strlen(yypvt[-0].sval), i; char *cp; w0 = 0;
  1144.             if(len % 3 == 2)
  1145.                 len++;    /* force empty word */
  1146.             for(i = 0, cp = yypvt[-0].sval; i < len; i++, cp++) {
  1147.                 w0 |= (*cp & 0xFF) << (2 - (i % 3)) * 8;
  1148.                 if(i % 3 == 2 || i == len - 1) {
  1149.                     if(pass == 2) {
  1150.                         if(list_on) printf("%c:%04X %06X%s%s\n",
  1151.                             segs[seg], pc, w0, 
  1152.                             spaces(14-6+5), 
  1153.                             substatement ? "" : luntab(inline));
  1154.                         gencode(seg, pc, w0);
  1155.                         substatement++;
  1156.                     }
  1157.                     pc++; w0 = 0;
  1158.                 }
  1159.             }
  1160.             free(yypvt[-0].sval);} break;
  1161. case 26:
  1162. # line 404 "a56.y"
  1163. {int frac = n2frac(yypvt[-0].n);
  1164.             if(pass == 2) {
  1165.                 if(list_on) {
  1166.                     printf("%c:%04X ", segs[seg], pc);
  1167.                     printf("%06X%s", 
  1168.                         frac & 0xFFFFFF,
  1169.                             spaces(14-6+5));
  1170.                     printf("%s\n",
  1171.                         substatement ? "" : luntab(inline));
  1172.                 }
  1173.                 gencode(seg, pc, frac);
  1174.                 substatement++;
  1175.             }
  1176.             pc++;} break;
  1177. case 27:
  1178. # line 420 "a56.y"
  1179. {yyval.ival = PROG;} break;
  1180. case 28:
  1181. # line 422 "a56.y"
  1182. {yyval.ival = XDATA;} break;
  1183. case 29:
  1184. # line 424 "a56.y"
  1185. {yyval.ival = YDATA;} break;
  1186. case 30:
  1187. # line 426 "a56.y"
  1188. {yyval.ival = LDATA;} break;
  1189. case 31:
  1190. # line 431 "a56.y"
  1191. {sym_def(yypvt[-0].sval, INT, pc);
  1192.             free(yypvt[-0].sval);} break;
  1193. case 33:
  1194. # line 438 "a56.y"
  1195. {if(just_rep) 
  1196.                 just_rep--;} break;
  1197. case 37:
  1198. # line 450 "a56.y"
  1199. {w0 |= 0x200000;} break;
  1200. case 39:
  1201. # line 459 "a56.y"
  1202. {w0 |= 0x80 | yypvt[-0].ival << 2;} break;
  1203. case 40:
  1204. # line 461 "a56.y"
  1205. {w0 |= 0x81 | yypvt[-0].ival << 2;} break;
  1206. case 41:
  1207. # line 463 "a56.y"
  1208. {w0 |= 0x82 | yypvt[-0].ival << 2;} break;
  1209. case 42:
  1210. # line 465 "a56.y"
  1211. {w0 |= 0x83 | yypvt[-0].ival << 2;} break;
  1212. case 43:
  1213. # line 468 "a56.y"
  1214. {w0 |= 0x04 | yypvt[-0].ival << 3;} break;
  1215. case 44:
  1216. # line 470 "a56.y"
  1217. {w0 |= 0x00 | yypvt[-0].ival << 3;} break;
  1218. case 45:
  1219. # line 472 "a56.y"
  1220. {w0 |= 0x00;} break;
  1221. case 46:
  1222. # line 475 "a56.y"
  1223. {w0 |= 0x01 | yypvt[-0].ival << 3;} break;
  1224. case 47:
  1225. # line 477 "a56.y"
  1226. {w0 |= 0x05 | yypvt[-0].ival << 3;} break;
  1227. case 48:
  1228. # line 479 "a56.y"
  1229. {w0 |= 0x07 | yypvt[-0].ival << 3;} break;
  1230. case 49:
  1231. # line 482 "a56.y"
  1232. {w0 |= 0x11 | yypvt[-0].ival << 3;} break;
  1233. case 50:
  1234. # line 484 "a56.y"
  1235. {w0 |= 0x12 | yypvt[-0].ival << 3;} break;
  1236. case 51:
  1237. # line 486 "a56.y"
  1238. {w0 |= 0x13 | yypvt[-0].ival << 3;} break;
  1239. case 52:
  1240. # line 488 "a56.y"
  1241. {w0 |= 0x16 | yypvt[-0].ival << 3;} break;
  1242. case 53:
  1243. # line 490 "a56.y"
  1244. {w0 |= 0x17 | yypvt[-0].ival << 3;} break;
  1245. case 54:
  1246. # line 493 "a56.y"
  1247. {w0 |= 0x02 | yypvt[-0].ival << 3;} break;
  1248. case 55:
  1249. # line 495 "a56.y"
  1250. {w0 |= 0x03 | yypvt[-0].ival << 3;} break;
  1251. case 56:
  1252. # line 497 "a56.y"
  1253. {w0 |= 0x06 | yypvt[-0].ival << 3;} break;
  1254. case 57:
  1255. # line 500 "a56.y"
  1256. {w0 |= 0x46 | yypvt[-0].ival << 3;} break;
  1257. case 58:
  1258. # line 502 "a56.y"
  1259. {w0 |= 0x42 | yypvt[-0].ival << 3;} break;
  1260. case 59:
  1261. # line 504 "a56.y"
  1262. {w0 |= 0x43 | yypvt[-0].ival << 3;} break;
  1263. case 60:
  1264. # line 507 "a56.y"
  1265. {w0 |= 0x22 | yypvt[-0].ival << 3;} break;
  1266. case 61:
  1267. # line 509 "a56.y"
  1268. {w0 |= 0x23 | yypvt[-0].ival << 3;} break;
  1269. case 62:
  1270. # line 511 "a56.y"
  1271. {w0 |= 0x26 | yypvt[-0].ival << 3;} break;
  1272. case 63:
  1273. # line 513 "a56.y"
  1274. {w0 |= 0x27 | yypvt[-0].ival << 3;} break;
  1275. case 64:
  1276. # line 516 "a56.y"
  1277. {w0 |= 0x32 | yypvt[-0].ival << 3;} break;
  1278. case 65:
  1279. # line 518 "a56.y"
  1280. {w0 |= 0x33 | yypvt[-0].ival << 3;} break;
  1281. case 66:
  1282. # line 520 "a56.y"
  1283. {w0 |= 0x36 | yypvt[-0].ival << 3;} break;
  1284. case 67:
  1285. # line 522 "a56.y"
  1286. {w0 |= 0x37 | yypvt[-0].ival << 3;} break;
  1287. case 68:
  1288. # line 525 "a56.y"
  1289. {w0 |= 0x21 | yypvt[-0].ival << 3;} break;
  1290. case 69:
  1291. # line 527 "a56.y"
  1292. {w0 |= 0x25 | yypvt[-0].ival << 3;} break;
  1293. case 70:
  1294. # line 531 "a56.y"
  1295. {yyval.ival = yypvt[-3].ival | yypvt[-0].ival << 1 | yypvt[-2].ival << 2;} break;
  1296. case 71:
  1297. # line 536 "a56.y"
  1298. {yyval.ival = 0;} break;
  1299. case 72:
  1300. # line 538 "a56.y"
  1301. {yyval.ival = 1;} break;
  1302. case 73:
  1303. # line 540 "a56.y"
  1304. {yyval.ival = 0;} break;
  1305. case 74:
  1306. # line 545 "a56.y"
  1307. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1308.                 case 0x00: yyval.ival = 0x0; break;
  1309.                 case 0x01: 
  1310.                 case 0x10: yyval.ival = 0x2; break;
  1311.                 case 0x11: 
  1312.                     yyerror("illegal source operands"); 
  1313.                     break;
  1314.             }} break;
  1315. case 75:
  1316. # line 554 "a56.y"
  1317. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1318.                 case 0x00: yyval.ival = 0x1; break;
  1319.                 case 0x01: 
  1320.                 case 0x10: yyval.ival = 0x3; break;
  1321.                 case 0x11: 
  1322.                     yyerror("illegal source operands"); 
  1323.                     break;
  1324.             }} break;
  1325. case 76:
  1326. # line 563 "a56.y"
  1327. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1328.                 case 0x00: yyval.ival = 0x5; break;
  1329.                 case 0x01: yyval.ival = 0x4; break;
  1330.                 case 0x10: yyval.ival = 0x6; break;
  1331.                 case 0x11: yyval.ival = 0x7; break;
  1332.             }} break;
  1333. case 77:
  1334. # line 570 "a56.y"
  1335. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1336.                 case 0x00: yyval.ival = 0x5; break;
  1337.                 case 0x01: yyval.ival = 0x6; break;
  1338.                 case 0x10: yyval.ival = 0x4; break;
  1339.                 case 0x11: yyval.ival = 0x7; break;
  1340.             }} break;
  1341. case 78:
  1342. # line 579 "a56.y"
  1343. {yyval.ival = 0x2;} break;
  1344. case 79:
  1345. # line 581 "a56.y"
  1346. {yyval.ival = 0x3;} break;
  1347. case 80:
  1348. # line 583 "a56.y"
  1349. {yyval.ival = 0x4 | yypvt[-0].ival;} break;
  1350. case 81:
  1351. # line 585 "a56.y"
  1352. {yyval.ival = 0x6 | yypvt[-0].ival;} break;
  1353. case 82:
  1354. # line 587 "a56.y"
  1355. {yyval.ival = 0x8 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1356. case 83:
  1357. # line 589 "a56.y"
  1358. {yyval.ival = 0xA | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1359. case 84:
  1360. # line 593 "a56.y"
  1361. {yyval.ival = 0x0;} break;
  1362. case 85:
  1363. # line 595 "a56.y"
  1364. {yyval.ival = 0x1;} break;
  1365. case 86:
  1366. # line 597 "a56.y"
  1367. {yyval.ival = 0x8 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1368. case 87:
  1369. # line 599 "a56.y"
  1370. {yyval.ival = 0xA | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1371. case 88:
  1372. # line 603 "a56.y"
  1373. {yyval.ival = 0x0;} break;
  1374. case 89:
  1375. # line 605 "a56.y"
  1376. {yyval.ival = 0x1;} break;
  1377. case 90:
  1378. # line 607 "a56.y"
  1379. {yyval.ival = 0x0;} break;
  1380. case 91:
  1381. # line 609 "a56.y"
  1382. {yyval.ival = 0x1;} break;
  1383. case 92:
  1384. # line 613 "a56.y"
  1385. {yyval.ival = yypvt[-0].ival;} break;
  1386. case 93:
  1387. # line 617 "a56.y"
  1388. {yyval.ival = 0x0 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1389. case 94:
  1390. # line 619 "a56.y"
  1391. {yyval.ival = 0x2 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1392. case 95:
  1393. # line 623 "a56.y"
  1394. {yyval.ival = yypvt[-0].ival;} break;
  1395. case 96:
  1396. # line 627 "a56.y"
  1397. {yyval.ival = yypvt[-0].ival;} break;
  1398. case 97:
  1399. # line 631 "a56.y"
  1400. {yyval.ival = 0x0 | yypvt[-0].ival;} break;
  1401. case 98:
  1402. # line 633 "a56.y"
  1403. {yyval.ival = 0x2 | yypvt[-0].ival;} break;
  1404. case 99:
  1405. # line 637 "a56.y"
  1406. {yyval.ival = 0;} break;
  1407. case 100:
  1408. # line 639 "a56.y"
  1409. {yyval.ival = 1;} break;
  1410. case 101:
  1411. # line 644 "a56.y"
  1412. {if(just_rep == 1)
  1413.                 yyerror("instruction not allowed after REP");} break;
  1414. case 105:
  1415. # line 655 "a56.y"
  1416. {w0 |= 0x01D815 | yypvt[-2].ival << 8 | yypvt[-0].ival << 3;} break;
  1417. case 106:
  1418. # line 657 "a56.y"
  1419. {w0 |= 0x018040 | yypvt[-0].ival << 3;} break;
  1420. case 107:
  1421. # line 659 "a56.y"
  1422. {w0 |= 0x0000F8 | (n2int(yypvt[-2].n) & 0xFF) << 8 | yypvt[-0].ival;} break;
  1423. case 108:
  1424. # line 661 "a56.y"
  1425. {w0 |= 0x0000B8 | (n2int(yypvt[-2].n) & 0xFF) << 8 | yypvt[-0].ival;} break;
  1426. case 113:
  1427. # line 676 "a56.y"
  1428. {if(yypvt[-0].ival) {
  1429.                 w0 |= 0x0BC0A0 | yypvt[-1].cond << 0;
  1430.             } else {
  1431.                 w0 |= 0x0F0000 | yypvt[-1].cond << 12;
  1432.             }} break;
  1433. case 114:
  1434. # line 682 "a56.y"
  1435. {if(yypvt[-0].ival) {
  1436.                 w0 |= 0x0AC0A0 | yypvt[-1].cond << 0;
  1437.             } else {
  1438.                 w0 |= 0x0E0000 | yypvt[-1].cond << 12;
  1439.             }} break;
  1440. case 115:
  1441. # line 688 "a56.y"
  1442. {if(yypvt[-0].ival) {
  1443.                 w0 |= 0x0BC080;
  1444.             } else {
  1445.                 w0 |= 0x0D0000;
  1446.             }} break;
  1447. case 116:
  1448. # line 694 "a56.y"
  1449. {if(yypvt[-0].ival) {
  1450.                 w0 |= 0x0AC080;
  1451.             } else {
  1452.                 w0 |= 0x0C0000;
  1453.             }} break;
  1454. case 117:
  1455. # line 701 "a56.y"
  1456. {w0 |= 0x0B0020;} break;
  1457. case 118:
  1458. # line 703 "a56.y"
  1459. {w0 |= 0x0B0000;} break;
  1460. case 119:
  1461. # line 705 "a56.y"
  1462. {w0 |= 0x0A0020;} break;
  1463. case 120:
  1464. # line 707 "a56.y"
  1465. {w0 |= 0x0A0000;} break;
  1466. case 121:
  1467. # line 710 "a56.y"
  1468. {just_rep = 2;} break;
  1469. case 122:
  1470. # line 712 "a56.y"
  1471. {uses_w1++;} break;
  1472. case 123:
  1473. # line 714 "a56.y"
  1474. {w0 |= 0x00008C;} break;
  1475. case 124:
  1476. # line 716 "a56.y"
  1477. {w0 |= 0x000087;} break;
  1478. case 125:
  1479. # line 718 "a56.y"
  1480. {w0 |= 0x000086;} break;
  1481. case 126:
  1482. # line 720 "a56.y"
  1483. {w0 |= 0x000084;} break;
  1484. case 127:
  1485. # line 722 "a56.y"
  1486. {w0 |= 0x00000C;} break;
  1487. case 128:
  1488. # line 724 "a56.y"
  1489. {w0 |= 0x000006;} break;
  1490. case 129:
  1491. # line 726 "a56.y"
  1492. {w0 |= 0x000005;} break;
  1493. case 130:
  1494. # line 728 "a56.y"
  1495. {w0 |= 0x000004;} break;
  1496. case 131:
  1497. # line 730 "a56.y"
  1498. {w0 |= 0x000000;
  1499.             just_rep = 0;} break;
  1500. case 132:
  1501. # line 735 "a56.y"
  1502. {int ival = n2int(yypvt[-2].n);
  1503.             w0 |= 0x060080 | (ival & 0xFF) << 8 | (ival & 0xF00)>> 8;
  1504.             if(ival > 0xFFF && pass == 2) {
  1505.                 yyerror("warning: immediate operand truncated");
  1506.             }
  1507.             w1 |= yypvt[-0].ival-1;} break;
  1508. case 133:
  1509. # line 742 "a56.y"
  1510. {w0 |= 0x06C000 | yypvt[-2].regs.r6 << 8;
  1511.             w1 |= yypvt[-0].ival-1;} break;
  1512. case 134:
  1513. # line 745 "a56.y"
  1514. {w0 |= 0x064000 | yypvt[-2].ival << 8 | yypvt[-3].ival << 6;
  1515.             w1 |= yypvt[-0].ival-1;} break;
  1516. case 135:
  1517. # line 748 "a56.y"
  1518. {w0 |= 0x060000 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-3].ival << 6;
  1519.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1520.                 yyerror("warning: address operand truncated");
  1521.             w1 |= yypvt[-0].ival-1;} break;
  1522. case 136:
  1523. # line 753 "a56.y"
  1524. {w0 |= 0x060000 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-3].ival << 6;
  1525.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1526.                 yyerror("warning: address operand truncated");
  1527.             w1 |= yypvt[-0].ival-1;} break;
  1528. case 137:
  1529. # line 761 "a56.y"
  1530. {int ival = n2int(yypvt[-0].n);
  1531.             w0 |= 0x0600A0 | (ival & 0xFF) << 8 | (ival & 0xF00)>> 8;
  1532.             if(ival > 0xFFF && pass == 2) {
  1533.                 yyerror("warning: immediate operand truncated");
  1534.             }} break;
  1535. case 138:
  1536. # line 767 "a56.y"
  1537. {w0 |= 0x06C020 | yypvt[-0].regs.r6 << 8;} break;
  1538. case 139:
  1539. # line 769 "a56.y"
  1540. {w0 |= 0x064020 | yypvt[-1].ival << 6 | yypvt[-0].ival << 8;} break;
  1541. case 140:
  1542. # line 771 "a56.y"
  1543. {w0 |= 0x060020 | yypvt[-1].ival << 6 | (yypvt[-0].ival & 0x3F) << 8;
  1544.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1545.                 yyerror("warning: address operand truncated");
  1546.             } break;
  1547. case 141:
  1548. # line 776 "a56.y"
  1549. {w0 |= 0x060020 | yypvt[-1].ival << 6 | (yypvt[-0].ival & 0x3F) << 8;
  1550.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1551.                 yyerror("warning: address operand truncated");
  1552.             } break;
  1553. case 142:
  1554. # line 784 "a56.y"
  1555. {w0 |= yypvt[-5].ival << 0 | yypvt[-3].ival << 6;
  1556.             uses_w1++;
  1557.             w1 = yypvt[-0].ival;} break;
  1558. case 143:
  1559. # line 788 "a56.y"
  1560. {w0 |= 0x00C000 | yypvt[-4].ival << 0 | yypvt[-2].regs.r6 << 8;
  1561.             uses_w1++;
  1562.             w1 = yypvt[-0].ival;} break;
  1563. case 144:
  1564. # line 799 "a56.y"
  1565. {if(yypvt[-0].ival != -1) {    /* symbol defined */
  1566.                 w0 |= (yypvt[-0].ival & 0x3F) << 8;
  1567.                 if(yypvt[-0].ival >= 0xFFC0) {
  1568.                     w0 |= 0x008080;
  1569.                 } else {
  1570.                     w0 |= 0x000080;
  1571.                     if(yypvt[-0].ival > 0x003F && pass == 2)
  1572.                         yyerror("warning: address operand truncated");
  1573.                 }
  1574.             }} break;
  1575. case 145:
  1576. # line 810 "a56.y"
  1577. {if(yypvt[-0].ival != -1) {
  1578.                 if(yypvt[-0].ival > 0x3F && pass == 2)
  1579.                     yyerror("warning: address operand truncated");
  1580.                 w0 |= 0x000080 | (yypvt[-0].ival & 0x3F) << 8;
  1581.             }} break;
  1582. case 146:
  1583. # line 816 "a56.y"
  1584. {if(yypvt[-0].ival != -1) {
  1585.                 if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1586.                     yyerror("warning: address operand truncated");
  1587.                 w0 |= 0x008080 | (yypvt[-0].ival & 0x3F) << 8;
  1588.             }} break;
  1589. case 147:
  1590. # line 822 "a56.y"
  1591. {w0 |= 0x004080 | yypvt[-0].ival << 8;} break;
  1592. case 148:
  1593. # line 829 "a56.y"
  1594. {w0 |= 0x0B0020;} break;
  1595. case 149:
  1596. # line 831 "a56.y"
  1597. {w0 |= 0x0B0000;} break;
  1598. case 150:
  1599. # line 833 "a56.y"
  1600. {w0 |= 0x0A0020;} break;
  1601. case 151:
  1602. # line 835 "a56.y"
  1603. {w0 |= 0x0A0000;} break;
  1604. case 152:
  1605. # line 840 "a56.y"
  1606. {w0 |= yypvt[-3].ival << 0 | yypvt[-1].ival << 6;} break;
  1607. case 153:
  1608. # line 842 "a56.y"
  1609. {w0 |= 0x00C040 | yypvt[-2].ival << 0 | yypvt[-0].regs.r6 << 8;} break;
  1610. case 154:
  1611. # line 847 "a56.y"
  1612. {if(yypvt[-0].ival != -1) {
  1613.                 w0 |= (yypvt[-0].ival & 0x3F) << 8 | 0x008000;
  1614.                 if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1615.                     yyerror("warning: address operand truncated");
  1616.             }} break;
  1617. case 155:
  1618. # line 853 "a56.y"
  1619. {if(yypvt[-0].ival != -1) {
  1620.                 w0 |= (yypvt[-0].ival & 0x3F) << 8 | 0x000000;
  1621.                 if(yypvt[-0].ival > 0x003F && pass == 2)
  1622.                     yyerror("warning: address operand truncated");
  1623.             }} break;
  1624. case 156:
  1625. # line 859 "a56.y"
  1626. {w0 |= 0x004000;} break;
  1627. case 160:
  1628. # line 869 "a56.y"
  1629. {w0 |= 0x044010 | yypvt[-2].ival << 8 | yypvt[-0].regs.r4;} break;
  1630. case 161:
  1631. # line 871 "a56.y"
  1632. {w0 |= yypvt[-1].cond << 12;} break;
  1633. case 162:
  1634. # line 876 "a56.y"
  1635. {w0 |= 0x020000 | yypvt[-0].ival << 3;} break;
  1636. case 163:
  1637. # line 878 "a56.y"
  1638. {w0 |= 0x030000 | yypvt[-3].ival << 3 | yypvt[-2].ival << 8 | yypvt[-0].ival;} break;
  1639. case 164:
  1640. # line 882 "a56.y"
  1641. {if(yypvt[-2].regs.flags & R_AB && yypvt[-0].regs.flags & R_AB) {
  1642.                 if(yypvt[-2].regs.ab == yypvt[-0].regs.ab) 
  1643.                     yyerror("source and dest must be different");
  1644.                 yyval.ival = yypvt[-0].regs.ab;
  1645.             } else if(yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  1646.                 yyval.ival = 0x8 | yypvt[-2].regs.xreg << 2 | yypvt[-0].regs.ab;
  1647.             } else if(yypvt[-2].regs.flags & R_YREG && yypvt[-0].regs.flags & R_AB) {
  1648.                 yyval.ival = 0xA | yypvt[-2].regs.yreg << 2 | yypvt[-0].regs.ab;
  1649.             } else 
  1650.                 yyerror("illegal TCC operands");
  1651.             } break;
  1652. case 165:
  1653. # line 896 "a56.y"
  1654. {if(yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  1655.                 yyval.ival = yypvt[-2].regs.xreg << 2 | yypvt[-0].regs.ab;
  1656.             } else if(yypvt[-2].regs.flags & R_YREG && yypvt[-0].regs.flags & R_AB) {
  1657.                 yyval.ival = yypvt[-2].regs.yreg << 2 | 2 | yypvt[-0].regs.ab;
  1658.             }} break;
  1659. case 166:
  1660. # line 905 "a56.y"
  1661. {if(yypvt[-3].ival == 0) {
  1662.                 w0 |= 0x05C020 | yypvt[-0].regs.ctl_reg;
  1663.             } else {
  1664.                 w0 |= 0x05C060 | yypvt[-0].regs.ctl_reg;
  1665.             }} break;
  1666. case 167:
  1667. # line 911 "a56.y"
  1668. {if(yypvt[-1].ival == 0) {
  1669.                 w0 |= 0x054020 | yypvt[-3].regs.ctl_reg;
  1670.             } else {
  1671.                 w0 |= 0x054060 | yypvt[-3].regs.ctl_reg;
  1672.             }} break;
  1673. case 168:
  1674. # line 917 "a56.y"
  1675. {int ival = n2int(yypvt[-2].n);
  1676.             if(ival < 256 && NOT long_symbolic_expr) {
  1677.                 w0 |= 0x0500A0 | (ival & 0xFF) << 8 | yypvt[-0].regs.ctl_reg; 
  1678.             } else {
  1679.                 w0 |= 0x05C020 | 0x003400 | yypvt[-0].regs.ctl_reg;
  1680.                 uses_w1++; w1 = ival & 0xFFFF;
  1681.             }} break;
  1682. case 169:
  1683. # line 925 "a56.y"
  1684. {if(yypvt[-3].ival == 0) {
  1685.                 w0 |= 0x058020 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-0].regs.ctl_reg;
  1686.             } else {
  1687.                 w0 |= 0x058060 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-0].regs.ctl_reg;
  1688.             }
  1689.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1690.                 yyerror("warning: address operand truncated");
  1691.             } break;
  1692. case 170:
  1693. # line 934 "a56.y"
  1694. {if(yypvt[-1].ival == 0) {
  1695.                 w0 |= 0x050020 | (yypvt[-0].ival & 0x3F) << 8 | yypvt[-3].regs.ctl_reg;
  1696.             } else {
  1697.                 w0 |= 0x050060 | (yypvt[-0].ival & 0x3F) << 8 | yypvt[-3].regs.ctl_reg;
  1698.             }
  1699.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1700.                 yyerror("warning: address operand truncated");
  1701.             } break;
  1702. case 171:
  1703. # line 943 "a56.y"
  1704. {if(yypvt[-2].regs.flags & R_CTL_REG) {
  1705.                 w0 |= 0x0440A0 | yypvt[-0].regs.r6 << 8 | yypvt[-2].regs.ctl_reg;
  1706.             } else if(yypvt[-0].regs.flags & R_CTL_REG) {
  1707.                 w0 |= 0x04C0A0 | yypvt[-2].regs.r6 << 8 | yypvt[-0].regs.ctl_reg;
  1708.             } else if(yypvt[-2].regs.flags & yypvt[-0].regs.flags & R_CTL_REG) {
  1709.                 /* bogus? $$$ */
  1710.                        w0 |= 0x04C0A0 | (yypvt[-2].regs.ctl_reg | 0x20) << 8 | 
  1711.                 yypvt[-0].regs.ctl_reg;
  1712.             } else {
  1713.                 yyerror("MOVEC must reference a control reg");
  1714.             }} break;
  1715. case 172:
  1716. # line 958 "a56.y"
  1717. {w0 |= 0x084080;
  1718.             switch(yypvt[-3].ea.pp << 1 | yypvt[-0].ea.pp) {
  1719.                 case 0:    case 3:
  1720.                     yyerror("illegal MOVEP; can't move EA to EA or IO to IO");
  1721.                     break;
  1722.                 case 1:    /* ea, pp */
  1723.                     w0 |= yypvt[-1].ival << 16 | 1 << 15 | yypvt[-4].ival << 6 |
  1724.                         (yypvt[-0].ea.ext & 0x3F);
  1725.                     if(yypvt[-3].ea.mode == 0x003000) {
  1726.                         w0 |= 0x003000;
  1727.                         uses_w1++;
  1728.                         w1 = yypvt[-3].ea.ext;
  1729.                     } else {
  1730.                         w0 |= yypvt[-3].ea.mode;
  1731.                     }
  1732.                     break;
  1733.                 case 2:    /* pp, ea */
  1734.                     w0 |= yypvt[-4].ival << 16 | 0 << 15 | yypvt[-1].ival << 6 |
  1735.                         (yypvt[-3].ea.ext & 0x3F);
  1736.                     if(yypvt[-0].ea.mode == 0x003000) {
  1737.                         w0 |= 0x003000;
  1738.                         uses_w1++;
  1739.                         w1 = yypvt[-0].ea.ext;
  1740.                     } else {
  1741.                         w0 |= yypvt[-0].ea.mode;
  1742.                     }
  1743.                     break;
  1744.             }} break;
  1745. case 173:
  1746. # line 987 "a56.y"
  1747. {w0 |= 0x084080;
  1748.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | 0x34 << 8 | 
  1749.                 (n2int(yypvt[-0].n) & 0x3F);
  1750.             uses_w1++;
  1751.             w1 = n2int(yypvt[-3].n);} break;
  1752. case 174:
  1753. # line 993 "a56.y"
  1754. {w0 |= 0x084040;
  1755.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | (n2int(yypvt[-0].n) & 0x3F);} break;
  1756. case 175:
  1757. # line 996 "a56.y"
  1758. {w0 |= 0x084040;
  1759.             if(yypvt[-3].ea.mode != 0x003000 && yypvt[-3].ea.mode != 0)
  1760.                 yyerror("illegal MOVEP");
  1761.             w0 |= yypvt[-4].ival << 16 | 0 << 15 | (yypvt[-3].ea.ext & 0x3F);} break;
  1762. case 176:
  1763. # line 1001 "a56.y"
  1764. {w0 |= 0x084000;
  1765.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | yypvt[-3].regs.r6 << 8 | 
  1766.                 (n2int(yypvt[-0].n) & 0x3F);} break;
  1767. case 177:
  1768. # line 1005 "a56.y"
  1769. {w0 |= 0x084000;
  1770.             if(!yypvt[-2].ea.pp)
  1771.                 yyerror("illegal MOVEP");
  1772.             w0 |= yypvt[-3].ival << 16 | 0 << 15 | yypvt[-0].regs.r6 << 8 | (yypvt[-2].ea.ext & 0x3F);} break;
  1773. case 178:
  1774. # line 1013 "a56.y"
  1775. {if(yypvt[-0].ival != UNDEF && yypvt[-0].ival >= 0xFFC0) {
  1776.                 /* defined symbol or constant, in i/o range */
  1777.                 yyval.ea.pp = 1;
  1778.                 yyval.ea.mode = 0;
  1779.             } else {
  1780.                 /* either out of i/o range or symbol not */
  1781.                 /* yet defined:  assume ea extension */
  1782.                 yyval.ea.pp = 0;
  1783.                 yyval.ea.mode = 0x003000;
  1784.             }
  1785.             yyval.ea.ext = yypvt[-0].ival;} break;
  1786. case 179:
  1787. # line 1025 "a56.y"
  1788. {yyval.ea.pp = 1;
  1789.             yyval.ea.mode = 0;
  1790.             if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1791.                 yyerror("warning: address operand truncated");
  1792.             yyval.ea.ext = yypvt[-0].ival;} break;
  1793. case 180:
  1794. # line 1031 "a56.y"
  1795. {yyval.ea.pp = 0;
  1796.             yyval.ea.mode = yypvt[-0].ival << 8;
  1797.             yyval.ea.ext = yypvt[-0].ival;} break;
  1798. case 181:
  1799. # line 1038 "a56.y"
  1800. {w0 |= 0x070000 | 0 << 15 | yypvt[-3].regs.r6;} break;
  1801. case 182:
  1802. # line 1040 "a56.y"
  1803. {w0 |= 0x070000 | 1 << 15 | yypvt[-0].regs.r6;} break;
  1804. case 183:
  1805. # line 1047 "a56.y"
  1806. {int ival = n2int(yypvt[-0].n);
  1807.             yyval.ival = ival; if(ival > 0x17) 
  1808.                 yyerror("%d: illegal bit number", ival);} break;
  1809. case 184:
  1810. # line 1053 "a56.y"
  1811. {yyval.ival = 0;} break;
  1812. case 185:
  1813. # line 1055 "a56.y"
  1814. {yyval.ival = 1;} break;
  1815. case 186:
  1816. # line 1061 "a56.y"
  1817. {w0 |= 0x004080;} break;
  1818. case 187:
  1819. # line 1063 "a56.y"
  1820. {w0 |= (yypvt[-0].ival & 0x3F) << 8;
  1821.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1822.                 yyerror("warning: address operand truncated");
  1823.             } break;
  1824. case 188:
  1825. # line 1070 "a56.y"
  1826. {yyval.ival = 1;} break;
  1827. case 189:
  1828. # line 1072 "a56.y"
  1829. {w0 |= yypvt[-0].ival & 0xFFF; yyval.ival = 0;
  1830.             if(yypvt[-0].ival > 0x0FFF && pass == 2)
  1831.                 yyerror("warning: address operand truncated");
  1832.             } break;
  1833. case 190:
  1834. # line 1079 "a56.y"
  1835. {w0 |= 0x003000;
  1836.             uses_w1++;
  1837.             w1 |= yypvt[-0].ival;
  1838.             yyval.ival = 0x003000;} break;
  1839. case 191:
  1840. # line 1084 "a56.y"
  1841. {w0 |= yypvt[-0].ival << 8;
  1842.             yyval.ival = yypvt[-0].ival << 8;} break;
  1843. case 192:
  1844. # line 1090 "a56.y"
  1845. {yyval.ival = yypvt[-0].ival;} break;
  1846. case 193:
  1847. # line 1092 "a56.y"
  1848. {yyval.ival = 4 << 3 | yypvt[-1].ival;} break;
  1849. case 194:
  1850. # line 1094 "a56.y"
  1851. {yyval.ival = 5 << 3 | yypvt[-3].ival;
  1852.             if(yypvt[-3].ival != yypvt[-1].ival) yyerror("Rn and Nn must be same number");} break;
  1853. case 195:
  1854. # line 1097 "a56.y"
  1855. {yyval.ival = 7 << 3 | yypvt[-1].ival;} break;
  1856. case 196:
  1857. # line 1102 "a56.y"
  1858. {yyval.ival = 0 << 3 | yypvt[-3].ival;
  1859.             if(yypvt[-3].ival != yypvt[-0].ival) yyerror("Rn and Nn must be same number");} break;
  1860. case 197:
  1861. # line 1105 "a56.y"
  1862. {yyval.ival = 1 << 3 | yypvt[-3].ival;
  1863.             if(yypvt[-3].ival != yypvt[-0].ival) yyerror("Rn and Nn must be same number");} break;
  1864. case 198:
  1865. # line 1108 "a56.y"
  1866. {yyval.ival = 2 << 3 | yypvt[-2].ival;} break;
  1867. case 199:
  1868. # line 1110 "a56.y"
  1869. {yyval.ival = 3 << 3 | yypvt[-2].ival;} break;
  1870. case 200:
  1871. # line 1116 "a56.y"
  1872. {yyval.regs.r6 = yyval.regs.r5 = 0x04 | yypvt[-0].ival;
  1873.             yyval.regs.sdx = yypvt[-0].ival;
  1874.             yyval.regs.xreg = yypvt[-0].ival;
  1875.             yyval.regs.flags = R_R6|R_R5|R_XREG|R_SDX|R_SFRAC;} break;
  1876. case 201:
  1877. # line 1121 "a56.y"
  1878. {yyval.regs.r6 = yyval.regs.r5 = 0x06 | yypvt[-0].ival;
  1879.             yyval.regs.sdy = yypvt[-0].ival;
  1880.             yyval.regs.yreg = yypvt[-0].ival;
  1881.             yyval.regs.flags = R_R6|R_R5|R_SDY|R_YREG|R_SFRAC;} break;
  1882. case 202:
  1883. # line 1126 "a56.y"
  1884. {switch(yypvt[-0].ival) {
  1885.                 case 0: 
  1886.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 0; 
  1887.                     break;
  1888.                 case 1: 
  1889.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 4; 
  1890.                     break;
  1891.                 case 2: 
  1892.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 2; 
  1893.                     break;
  1894.             }
  1895.             yyval.regs.flags = R_R6|R_R5|R_UINT;} break;
  1896. case 203:
  1897. # line 1139 "a56.y"
  1898. {switch(yypvt[-0].ival) {
  1899.                 case 0: 
  1900.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 1; break;
  1901.                 case 1: 
  1902.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 5; break;
  1903.                 case 2: 
  1904.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 3; break;
  1905.             }
  1906.             yyval.regs.flags = R_R6|R_R5|R_UINT;} break;
  1907. case 204:
  1908. # line 1149 "a56.y"
  1909. {yyval.regs.r6 = yyval.regs.r5 = 0x0E;
  1910.             yyval.regs.sdx = yyval.regs.sdy = 0x2;
  1911.             yyval.regs.ab = 0;
  1912.             yyval.regs.lsd = 4;
  1913.             yyval.regs.flags = R_R6|R_R5|R_SDX|R_SDY|R_AB|R_LSD|R_SFRAC;} break;
  1914. case 205:
  1915. # line 1155 "a56.y"
  1916. {yyval.regs.r6 = yyval.regs.r5 = 0x0F;
  1917.             yyval.regs.sdx = yyval.regs.sdy = 0x3;
  1918.             yyval.regs.ab = 1;
  1919.             yyval.regs.lsd = 5;
  1920.             yyval.regs.flags = R_R6|R_R5|R_SDX|R_SDY|R_AB|R_LSD|R_SFRAC;} break;
  1921. case 206:
  1922. # line 1161 "a56.y"
  1923. {yyval.regs.r6 = yyval.regs.r5 = 0x10 | yypvt[-0].ival;
  1924.             yyval.regs.r4 = 0x00 | yypvt[-0].ival;
  1925.             yyval.regs.flags = R_R6|R_R5|R_R4|R_UINT;} break;
  1926. case 207:
  1927. # line 1165 "a56.y"
  1928. {yyval.regs.r6 = yyval.regs.r5 = 0x18 | yypvt[-0].ival;
  1929.             yyval.regs.r4 = 0x08 | yypvt[-0].ival;
  1930.             yyval.regs.flags = R_R6|R_R5|R_R4|R_UINT;} break;
  1931. case 208:
  1932. # line 1169 "a56.y"
  1933. {yyval.regs.r6 = 0x20 | yypvt[-0].ival;
  1934.             yyval.regs.r5 = -1;
  1935.             yyval.regs.ctl_reg = yypvt[-0].ival;
  1936.             yyval.regs.flags = R_R6|R_R5|R_CTL_REG|R_UINT;} break;
  1937. case 209:
  1938. # line 1174 "a56.y"
  1939. {yyval.regs.r6 = 0x38 | yypvt[-0].ival;
  1940.             yyval.regs.r5 = -1;
  1941.             yyval.regs.ctl_reg = 0x18 | yypvt[-0].ival;
  1942.             yyval.regs.flags = R_R6|R_R5|R_CTL_REG|R_UINT;} break;
  1943. case 210:
  1944. # line 1179 "a56.y"
  1945. {yyval.regs.lsd  = 0;
  1946.             yyval.regs.flags = R_LSD;} break;
  1947. case 211:
  1948. # line 1182 "a56.y"
  1949. {yyval.regs.lsd = 1;
  1950.             yyval.regs.flags = R_LSD;} break;
  1951. case 212:
  1952. # line 1185 "a56.y"
  1953. {yyval.regs.lsd = 2;
  1954.             yyval.regs.flags = R_LSD;} break;
  1955. case 213:
  1956. # line 1188 "a56.y"
  1957. {yyval.regs.lsd = 3;
  1958.             yyval.regs.flags = R_LSD;} break;
  1959. case 214:
  1960. # line 1191 "a56.y"
  1961. {yyval.regs.lsd = 6;
  1962.             yyval.regs.flags = R_LSD;} break;
  1963. case 215:
  1964. # line 1194 "a56.y"
  1965. {yyval.regs.lsd = 7;
  1966.             yyval.regs.flags = R_LSD;} break;
  1967. case 216:
  1968. # line 1200 "a56.y"
  1969. {yyval.ival = 1;} break;
  1970. case 217:
  1971. # line 1202 "a56.y"
  1972. {yyval.ival = 2;} break;
  1973. case 218:
  1974. # line 1204 "a56.y"
  1975. {yyval.ival = 3;} break;
  1976. case 219:
  1977. # line 1206 "a56.y"
  1978. {yyval.ival = 4;} break;
  1979. case 220:
  1980. # line 1208 "a56.y"
  1981. {yyval.ival = 5;} break;
  1982. case 221:
  1983. # line 1210 "a56.y"
  1984. {yyval.ival = 6;} break;
  1985. case 222:
  1986. # line 1212 "a56.y"
  1987. {yyval.ival = 7;} break;
  1988. case 223:
  1989. # line 1217 "a56.y"
  1990. {yyval.ival = 0;} break;
  1991. case 224:
  1992. # line 1219 "a56.y"
  1993. {yyval.ival = 1;} break;
  1994. case 225:
  1995. # line 1221 "a56.y"
  1996. {yyval.ival = 2;} break;
  1997. case 234:
  1998. # line 1238 "a56.y"
  1999. {int ival = n2int(yypvt[-2].n);
  2000.             int frac = n2frac(yypvt[-2].n);
  2001.             int value;
  2002.             BOOL shortform = FALSE;
  2003.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2004.                 yyerror("please use MOVEC for control register moves");
  2005.                 break;
  2006.             }
  2007.             if(yypvt[-0].regs.flags & R_SFRAC && yypvt[-2].n.type == FLT) {
  2008.                 if((frac & 0xFFFF) == 0 && 
  2009.                     NOT long_symbolic_expr) {
  2010.                     value = frac >> 16;
  2011.                     shortform++;
  2012.                 } else {
  2013.                     value = frac;
  2014.                 }
  2015.             } else {
  2016.                 if(ival <= 0xFF && NOT long_symbolic_expr) {
  2017.                     value = ival;
  2018.                     shortform++;
  2019.                 } else {
  2020.                     value = ival;
  2021.                 }
  2022.             }
  2023.  
  2024.             if(shortform) {
  2025.                 w0 |= 0x200000 | (value & 0xFF) << 8 |
  2026.                     yypvt[-0].regs.r5 << 16;
  2027.             } else {
  2028.                 w0 |= 0x400000 | 0x00F400 |
  2029.                     (yypvt[-0].regs.r5 >> 3 & 3) << 20 | 
  2030.                     (yypvt[-0].regs.r5 & 7) << 16;
  2031.                 uses_w1++; w1 = value;
  2032.             }} break;
  2033. case 235:
  2034. # line 1275 "a56.y"
  2035. {
  2036.                 if(yypvt[-0].regs.flags & R_CTL_REG) {
  2037.                     yyerror("please use MOVEC for control register moves");
  2038.                     break;
  2039.                 }
  2040.                 if(yypvt[-2].regs.flags & R_R5 & yypvt[-0].regs.flags) 
  2041.                     w0 |= 0x200000 | yypvt[-0].regs.r5 << 8 | yypvt[-2].regs.r5 << 13;
  2042.                 else
  2043.                     yyerror("illegal R move");
  2044.             } break;
  2045. case 236:
  2046. # line 1288 "a56.y"
  2047. {w0 |= 0x204000 | yypvt[-0].ival << 8;} break;
  2048. case 237:
  2049. # line 1293 "a56.y"
  2050. {w0 |= 0x40C000 | yypvt[-3].ival << 19;
  2051.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2052.                 yyerror("please use MOVEC for control register moves");
  2053.                 break;
  2054.             }
  2055.             w0 |= (yypvt[-0].regs.r5 >> 3 & 3) << 20 | (yypvt[-0].regs.r5 & 7) << 16;} break;
  2056. case 238:
  2057. # line 1300 "a56.y"
  2058. {w0 |= 0x408000 | yypvt[-3].ival << 19 | (yypvt[-2].ival & 0x3F) << 8;
  2059.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2060.                 yyerror("please use MOVEC for control register moves");
  2061.                 break;
  2062.             }
  2063.             if(yypvt[-2].ival > 0x003F && pass == 2)
  2064.                 yyerror("warning: address operand truncated");
  2065.             w0 |= (yypvt[-0].regs.r5>> 3 & 3) << 20 | (yypvt[-0].regs.r5 & 7) << 16;} break;
  2066. case 239:
  2067. # line 1309 "a56.y"
  2068. {w0 |= 0x404000 | yypvt[-1].ival << 19;
  2069.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2070.                 yyerror("please use MOVEC for control register moves");
  2071.                 break;
  2072.             }
  2073.             w0 |= (yypvt[-3].regs.r5 >> 3 & 3) << 20 | (yypvt[-3].regs.r5 & 7) << 16;} break;
  2074. case 240:
  2075. # line 1316 "a56.y"
  2076. {w0 |= 0x400000 | yypvt[-1].ival << 19 | (yypvt[-0].ival & 0x3F) << 8;
  2077.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2078.                 yyerror("please use MOVEC for control register moves");
  2079.                 break;
  2080.             }
  2081.             if(yypvt[-0].ival > 0x003F && pass == 2)
  2082.                 yyerror("warning: address operand truncated");
  2083.             w0 |= (yypvt[-3].regs.r5 >> 3 & 3) << 20 | (yypvt[-3].regs.r5 & 7) << 16;} break;
  2084. case 241:
  2085. # line 1325 "a56.y"
  2086. {w0 |= 0x400000 | 0x00F400 | (yypvt[-0].regs.r5 >> 3 & 3) << 20 |
  2087.                 (yypvt[-0].regs.r5 & 7) << 16;
  2088.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2089.                 yyerror("please use MOVEC for control register moves");
  2090.                 break;
  2091.             }
  2092.             uses_w1++; w1 = n2frac(yypvt[-2].n);
  2093.             } break;
  2094. case 242:
  2095. # line 1336 "a56.y"
  2096. {if(yypvt[-6].ival == 0 && yypvt[-2].regs.flags & R_AB) {
  2097.                 w0 |= 0x108000 | yypvt[-3].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2098.                     yypvt[-0].ival << 16;
  2099.             } else {
  2100.                 yyerror("illegal X:R move");
  2101.             }} break;
  2102. case 243:
  2103. # line 1343 "a56.y"
  2104. {if(yypvt[-2].regs.flags & R_AB) {
  2105.                 w0 |= 0x10B400 | yypvt[-3].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2106.                     yypvt[-0].ival << 16;
  2107.                 uses_w1++;
  2108.                 w1 |= n2frac(yypvt[-5].n) & 0xFFFFFF;
  2109.             } else {
  2110.                 yyerror("illegal X:R move");
  2111.             }} break;
  2112. case 244:
  2113. # line 1352 "a56.y"
  2114. {if(yypvt[-6].regs.flags & R_SDX && yypvt[-4].ival == 0 && yypvt[-2].regs.flags & R_AB &&
  2115.                 yypvt[-0].regs.flags & R_YREG) {
  2116.                 w0 |= 0x100000 | yypvt[-6].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2117.                     yypvt[-0].regs.yreg << 16;
  2118.             } else if(yypvt[-6].regs.flags & R_AB && yypvt[-4].ival == 0 && 
  2119.                 yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  2120.                 if(yypvt[-2].regs.xreg != 0) yyerror("must use X0");
  2121.                 if(yypvt[-6].regs.ab == 0 && yypvt[-0].regs.ab == 0)
  2122.                     w0 |= 0x080000;
  2123.                 else if(yypvt[-6].regs.ab == 1 && yypvt[-0].regs.ab == 1)
  2124.                     w0 |= 0x090000;
  2125.                 else
  2126.                     yyerror("illegal X:R move");
  2127.             } else {
  2128.                 yyerror("illegal X:R move");
  2129.             }} break;
  2130. case 245:
  2131. # line 1371 "a56.y"
  2132. {if(yypvt[-4].regs.flags & R_XREG && yypvt[-0].regs.flags & (R_YREG|R_AB)) {
  2133.                 w0 |= 0x10C000 | yypvt[-6].regs.ab << 19 | yypvt[-4].regs.xreg << 18 |
  2134.                     yypvt[-0].regs.sdy << 16;
  2135.             } else {
  2136.                 yyerror("illegal R:Y move");
  2137.             }} break;
  2138. case 246:
  2139. # line 1378 "a56.y"
  2140. {if(yypvt[-3].regs.flags & R_XREG && yypvt[-0].regs.flags & (R_YREG|R_AB)) {
  2141.                 w0 |= 0x10F400 | yypvt[-5].regs.ab << 19 | yypvt[-3].regs.xreg << 18 |
  2142.                     yypvt[-0].regs.sdy << 16;
  2143.                 uses_w1++;
  2144.                 w1 |= n2frac(yypvt[-2].n) & 0xFFFFFF;
  2145.             } else {
  2146.                 yyerror("illegal R:Y move");
  2147.             }} break;
  2148. case 247:
  2149. # line 1387 "a56.y"
  2150. {if(yypvt[-6].regs.flags & R_AB && yypvt[-4].regs.flags & R_XREG) {
  2151.                 w0 |= 0x104000 | yypvt[-6].regs.ab << 19 | yypvt[-4].regs.xreg << 18 |
  2152.                 yypvt[-3].regs.sdy << 16;
  2153.             } else if (yypvt[-6].regs.flags & R_YREG && yypvt[-4].regs.flags & R_AB &&
  2154.                 yypvt[-3].regs.flags & R_AB) {
  2155.                 if(yypvt[-6].regs.yreg != 0) yyerror("must use Y0");
  2156.                 if(yypvt[-4].regs.ab == 0 && yypvt[-3].regs.ab == 0)
  2157.                     w0 |= 0x088000;
  2158.                 else if(yypvt[-4].regs.ab == 1 && yypvt[-3].regs.ab == 1)
  2159.                     w0 |= 0x098000;
  2160.                 else
  2161.                     yyerror("illegal R:Y move");
  2162.             } else {
  2163.                 yyerror("illegal R:Y move");
  2164.             }} break;
  2165. case 248:
  2166. # line 1405 "a56.y"
  2167. {if(yypvt[-0].regs.flags & R_CTL_REG) {
  2168.                 yyerror("please use MOVEC for control register moves");
  2169.                 break;
  2170.             }
  2171.             w0 |= 0x40C000 | (yypvt[-0].regs.lsd & 3) << 16 | (yypvt[-0].regs.lsd >> 2) << 19;} break;
  2172. case 249:
  2173. # line 1411 "a56.y"
  2174. {if(yypvt[-3].regs.flags & R_CTL_REG) {
  2175.                 yyerror("please use MOVEC for control register moves");
  2176.                 break;
  2177.             }
  2178.             w0 |= 0x404000 | (yypvt[-3].regs.lsd & 3) << 16 | (yypvt[-3].regs.lsd >> 2) << 19;} break;
  2179. case 250:
  2180. # line 1417 "a56.y"
  2181. {w0 |= 0x408000 | (yypvt[-0].regs.lsd & 3) << 16 | (yypvt[-0].regs.lsd >> 2) << 19;
  2182.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2183.                 yyerror("please use MOVEC for control register moves");
  2184.                 break;
  2185.             }
  2186.             if(yypvt[-2].ival > 0x003F && pass == 2)
  2187.                 yyerror("warning: address operand truncated");
  2188.             w0 |= (yypvt[-2].ival & 0x3F) << 8;} break;
  2189. case 251:
  2190. # line 1426 "a56.y"
  2191. {w0 |= 0x400000 | (yypvt[-3].regs.lsd & 3) << 16 | (yypvt[-3].regs.lsd >> 2) << 19;
  2192.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2193.                 yyerror("please use MOVEC for control register moves");
  2194.                 break;
  2195.             }
  2196.             if(yypvt[-0].ival > 0x003F && pass == 2)
  2197.                 yyerror("warning: address operand truncated");
  2198.             w0 |= (yypvt[-0].ival & 0x3F) << 8;} break;
  2199. case 252:
  2200. # line 1437 "a56.y"
  2201. {int eax = yypvt[-6].ival, eay = yypvt[-2].ival,
  2202.                  regx = (yypvt[-4].regs.flags & R_AB) ? yypvt[-4].regs.ab | 2 : yypvt[-4].regs.xreg,
  2203.                  regy = (yypvt[-0].regs.flags & R_AB) ? yypvt[-0].regs.ab | 2 : yypvt[-0].regs.yreg;
  2204.             if((eax & 0x400) == (eay & 0x400))
  2205.                 yyerror("registers must be in opposite halves");
  2206.             if(!(yypvt[-4].regs.flags & (R_AB | R_XREG)))
  2207.                 yyerror("invalid X move register");
  2208.             if(!(yypvt[-0].regs.flags & (R_AB | R_YREG)))
  2209.                 yyerror("invalid Y move register");
  2210.             if(yypvt[-4].regs.flags & R_AB &&
  2211.                yypvt[-0].regs.flags & R_AB &&
  2212.                yypvt[-4].regs.ab == yypvt[-0].regs.ab)
  2213.                 yyerror("duplicate destination register");
  2214.             w0 = w0 & 0xFF | 0xC08000;    /* both write */
  2215.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2216. case 253:
  2217. # line 1453 "a56.y"
  2218. {int eax = yypvt[-6].ival, eay = yypvt[-0].ival,
  2219.                  regx = (yypvt[-4].regs.flags & R_AB) ? yypvt[-4].regs.ab | 2 : yypvt[-4].regs.xreg,
  2220.                  regy = (yypvt[-3].regs.flags & R_AB) ? yypvt[-3].regs.ab | 2 : yypvt[-3].regs.yreg;
  2221.             if((eax & 0x400) == (eay & 0x400))
  2222.                 yyerror("registers must be in opposite halves");
  2223.             if(!(yypvt[-4].regs.flags & (R_AB | R_XREG)))
  2224.                 yyerror("invalid X move register");
  2225.             if(!(yypvt[-3].regs.flags & (R_AB | R_YREG)))
  2226.                 yyerror("invalid Y move register");
  2227.             w0 = w0 & 0xFF | 0x808000;    /* X:write, Y:read */
  2228.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2229. case 254:
  2230. # line 1465 "a56.y"
  2231. {int eax = yypvt[-4].ival, eay = yypvt[-2].ival,
  2232.                  regx = (yypvt[-7].regs.flags & R_AB) ? yypvt[-7].regs.ab | 2 : yypvt[-7].regs.xreg,
  2233.                  regy = (yypvt[-0].regs.flags & R_AB) ? yypvt[-0].regs.ab | 2 : yypvt[-0].regs.yreg;
  2234.             if((eax & 0x400) == (eay & 0x400))
  2235.                 yyerror("registers must be in opposite halves");
  2236.             if(!(yypvt[-7].regs.flags & (R_AB | R_XREG)))
  2237.                 yyerror("invalid X move register");
  2238.             if(!(yypvt[-0].regs.flags & (R_AB | R_YREG)))
  2239.                 yyerror("invalid Y move register");
  2240.                   w0 = w0 & 0xFF | 0xC00000;    /* X:read, Y:write */
  2241.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2242. case 255:
  2243. # line 1477 "a56.y"
  2244. {int eax = yypvt[-4].ival, eay = yypvt[-0].ival,
  2245.                  regx = (yypvt[-7].regs.flags & R_AB) ? yypvt[-7].regs.ab | 2 : yypvt[-7].regs.xreg,
  2246.                  regy = (yypvt[-3].regs.flags & R_AB) ? yypvt[-3].regs.ab | 2 : yypvt[-3].regs.yreg;
  2247.             if((eax & 0x400) == (eay & 0x400))
  2248.                 yyerror("registers must be in opposite halves");
  2249.             if(!(yypvt[-7].regs.flags & (R_AB | R_XREG)))
  2250.                 yyerror("invalid X move register");
  2251.             if(!(yypvt[-3].regs.flags & (R_AB | R_YREG)))
  2252.                 yyerror("invalid Y move register");
  2253.                   w0 = w0 & 0xFF | 0x800000;    /* both read */
  2254.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2255. case 256:
  2256. # line 1493 "a56.y"
  2257. {yyval.n = yypvt[-0].n;} break;
  2258. case 257:
  2259. # line 1495 "a56.y"
  2260. {yyval.n = yypvt[-0].n;} break;
  2261. case 258:
  2262. # line 1497 "a56.y"
  2263. {yyval.n = yypvt[-0].n;} break;
  2264. case 259:
  2265. # line 1501 "a56.y"
  2266. {yyval.n = yypvt[-0].n;} break;
  2267. case 260:
  2268. # line 1503 "a56.y"
  2269. {yyval.n.val.i = n2int(yypvt[-0].n) & 0xFF;
  2270.             yyval.n.type = INT;
  2271.             long_symbolic_expr = FALSE;} break;
  2272. case 261:
  2273. # line 1509 "a56.y"
  2274. {yyval.n = yypvt[-0].n;} break;
  2275. case 262:
  2276. # line 1514 "a56.y"
  2277. {yyval.ival = n2int(yypvt[-0].n);} break;
  2278. case 263:
  2279. # line 1516 "a56.y"
  2280. {yyval.ival = pc;} break;
  2281. case 264:
  2282. # line 1521 "a56.y"
  2283. {yyval.ival = n2int(yypvt[-0].n);} break;
  2284. case 265:
  2285. # line 1523 "a56.y"
  2286. {yyval.ival = pc;} break;
  2287. case 266:
  2288. # line 1528 "a56.y"
  2289. {yyval.ival = n2int(yypvt[-0].n);} break;
  2290. case 267:
  2291. # line 1533 "a56.y"
  2292. {yyval.n = yypvt[-0].n;} break;
  2293. case 268:
  2294. # line 1535 "a56.y"
  2295. {yyval.n = sym_ref(yypvt[-0].sval); free(yypvt[-0].sval);} break;
  2296. case 269:
  2297. # line 1540 "a56.y"
  2298. {yyval.n = yypvt[-0].n;} break;
  2299. case 270:
  2300. # line 1542 "a56.y"
  2301. {yyval.n = sym_ref(yypvt[-0].sval); free(yypvt[-0].sval); long_symbolic_expr++;} break;
  2302. case 271:
  2303. # line 1544 "a56.y"
  2304. {yyval.n.type = INT; yyval.n.val.i = yypvt[-0].cval & 0xFFFFFF;} break;
  2305. case 272:
  2306. # line 1548 "a56.y"
  2307. {yyval.n = binary_op(yypvt[-2].n, '|', yypvt[-0].n);} break;
  2308. case 273:
  2309. # line 1550 "a56.y"
  2310. {yyval.n = binary_op(yypvt[-2].n, '^', yypvt[-0].n);} break;
  2311. case 274:
  2312. # line 1552 "a56.y"
  2313. {yyval.n = binary_op(yypvt[-2].n, '&', yypvt[-0].n);} break;
  2314. case 275:
  2315. # line 1554 "a56.y"
  2316. {yyval.n = binary_op(yypvt[-2].n, SHR, yypvt[-0].n);} break;
  2317. case 276:
  2318. # line 1556 "a56.y"
  2319. {yyval.n = binary_op(yypvt[-2].n, SHL, yypvt[-0].n);} break;
  2320. case 277:
  2321. # line 1558 "a56.y"
  2322. {yyval.n = binary_op(yypvt[-2].n, '-', yypvt[-0].n);} break;
  2323. case 278:
  2324. # line 1560 "a56.y"
  2325. {yyval.n = binary_op(yypvt[-2].n, '+', yypvt[-0].n);} break;
  2326. case 279:
  2327. # line 1562 "a56.y"
  2328. {yyval.n = binary_op(yypvt[-2].n, '%', yypvt[-0].n);} break;
  2329. case 280:
  2330. # line 1564 "a56.y"
  2331. {yyval.n = binary_op(yypvt[-2].n, '/', yypvt[-0].n);} break;
  2332. case 281:
  2333. # line 1566 "a56.y"
  2334. {yyval.n = binary_op(yypvt[-2].n, '*', yypvt[-0].n);} break;
  2335. case 282:
  2336. # line 1568 "a56.y"
  2337. {yyval.n = unary_op('-', yypvt[-0].n);} break;
  2338. case 283:
  2339. # line 1570 "a56.y"
  2340. {yyval.n = unary_op('~', yypvt[-0].n);} break;
  2341. case 284:
  2342. # line 1572 "a56.y"
  2343. {yyval.n = yypvt[-1].n;} break;
  2344. case 285:
  2345. # line 1574 "a56.y"
  2346. {yyval.n = yypvt[-0].n;} break;
  2347.         }
  2348.         goto yystack;  /* stack new state and value */
  2349.  
  2350.     }
  2351.